生成具有不同概率的范围内的随机数

Dan*_*inu 8 random algorithm math probability

如何在A = 1和B = 10之间生成一个随机数,其中每个数字的概率不同?

示例:数量/概率

1 - 20%

2 - 20%

3 - 10%

4 - 5%

5 - 5%

...等等.

我知道一些硬编码的解决方法,遗憾的是,对于更大的范围没有用,例如A = 1000和B = 100000.

假设我们有一个

    Rand()
Run Code Online (Sandbox Code Playgroud)

返回一个随机数R,0 <R <1的方法,任何人都可以用适当的方式发布代码样本吗?在c#/ java/actionscript中可以解释.

Jim*_*hel 6

构建一个包含100个整数的数组,并用20 1,20 2,10 3,5 4,5 5等填充它.然后只需从数组中随机选择一个项目.

int[] numbers = new int[100];
// populate the first 20 with the value '1'
for (int i = 0; i < 20; ++i)
{
    numbers[i] = 1;
}
// populate the rest of the array as desired.

// To get an item:
// Since your Rand() function returns 0 < R < 1
int ix = (int)(Rand() * 100);
int num = numbers[ix];
Run Code Online (Sandbox Code Playgroud)

如果项目数量相当小并且您的精度不是太严格,那么这种方法很有效.也就是说,如果你想要4.375%7,那么你需要一个更大的阵列.


use*_*430 5

Knuth归功于AJWalker(Electronics Letters 10,8(1974),127-128; ACM Trans.Math Software 3(1977),253-256).

这个想法是,如果你有总共n种不同颜色的k*n个球,那么就可以将球分配到n个容器中,这样容器就可以了.我包含颜色为i的球,最多包含另一种颜色.证据是通过n的归纳.对于诱导步骤,选择具有最少球数的颜色.

在您的示例中,n = 10.将概率乘以适当的m,使得它们都是整数.所以,也许m = 100,你有20个颜色0球,20个颜色球,10个颜色球2个,5个颜色球3个等等.所以,k = 10.

现在生成一个维度为n的表格,每个条目是一个概率(颜色i与另一种颜色的球的比例)和另一种颜色.

要生成随机球,请生成[0,n]范围内的随机浮点数r.设I是整数部分(r的底面),x是多余的(r - i).

if (x < table[i].probability) output i
else output table[i].other
Run Code Online (Sandbox Code Playgroud)

该算法的优势在于,对于每个随机球,您只进行一次比较.

让我找出一个例子(与Knuth相同).

考虑模拟投掷一对骰子.

所以P(2)= 1/36,P(3)= 2/36,P(4)= 3/36,P(5)= 4/36,P(6)= 5/36,P(7) = 6/36,P(8)= 5/36,P(9)= 4/36,P(10)= 3/36,P(11)= 2/36,P(12)= 1/36.

乘以36*11得到393个球,11个颜色2,22个颜色3个,33个颜色4个,......,11个颜色12.我们有k = 393/11 = 36.

表[2] =(11/36,颜色4)

表[12] =(11/36,颜色10)

表[3] =(22/36,颜色5)

表[11] =(22/36,颜色5)

表[4] =(8/36,颜色9)

表[10] =(8/36,颜色6)

表[5] =(16/36,颜色6)

表[9] =(16/36,颜色8)

表[6] =(7/36,颜色8)

表[8] =(6/36,颜色7)

表[7] =(36/36,颜色7)


Som*_*ame 1

根据概率将均匀随机结果映射到所需的输出。

例如,对于你的例子:

If `0 <= Round() <= 0.2`: result = 1.
If `0.2 < Round() <= 0.4`: result = 2.
If `0.4 < Round() <= 0.5`: result = 3.
If `0.5 < Round() <= 0.55`: result = 4.
If `0.55 < Round() <= 0.65`: result = 5.
...
Run Code Online (Sandbox Code Playgroud)