您已经是一个很好的方法,并且适用于任何范围。
只是想想:另一个可能性是通过与常数乘法器相乘来消除分数,然后构建一个具有此乘数大小的数组。乘以10你得到
P(1) = 2
P(2) = 3
P(3) = 5
然后,您创建一个具有反向值的数组 – ‘1’进入元素1和2,’2’变为3到6,依此类推:
P =(1,1,2,2,2,3,3,3,3,3);
然后您可以从该数组中选择一个随机元素。
(添加)使用kiruwka的评论中的示例中的概率:
int[] numsToGenerate = new int[] { 1, 2, 3, 4, 5 };
double[] discreteProbabilities = new double[] { 0.1, 0.25, 0.3, 0.25, 0.1 };
导致全部整数的最小乘数是20,这给你
2, 5, 6, 5, 2
因此numsToGenerate的长度将为20,具有以下值:
1 1
2 2 2 2 2
3 3 3 3 3 3
4 4 4 4 4
5 5
分配是完全一样的:例如,“1”的机会现在是20中的2个 – 仍然是0.1。
这是基于您的原始概率,总计达到1.如果不是,则将总数乘以相同的因子(也就是数组长度)。