只是想知道这是什么类型的算法,
或者如果有更容易/更有效的方法来解决这个问题:
假设我们有一定的概率密度,比如说
prob[] = {.1, .15, .25, .05, .45}
第1组 - 10%
第2组 - 15%
第3组 - 25%
第4组 - 5%
第5组 - 45%
和随机数,(0,1),
跑= .853234
插入5组中的一组
if (ran <=prob[0]) selection = 1;
else if (ran <= prob[0]+prob[1]) selection = 2;
...
else if (ran <= prob[0]+prob[1]+...+prob[4]) selection = 5;
我对随机数生成并不十分熟悉
答案 0 :(得分:2)
你在这里做的是反转cumulative distribution function。设F
为具有给定分布的随机变量X
的CDF,然后将其定义为F(x) == P[X <= x]
。
这里非常有用的是,如果你在0和1之间生成一个统一的随机变量U
,那么
P[F^-1(U) <= x] == P[U <= F(x)] == F(x) == P[X <= x]
表示F^-1(U)
与X
具有相同的分布!
当然,这只有在你可以反转CDF时才有可能,但在你的情况下F
是一个分段函数(如阶梯),并且对于给定的统一值,你的算法确定在哪一步价值得到满足。因此,您的算法完全正确。
但是,如果您要生成大量随机数,则可以改进它:首先生成CDF表,在您的情况下将是
CDF[] = {.1, .25, .5, .55, 1.}
然后对于0到1之间的每个生成的统一数字,只需在CDF表上执行二分法以重新查找相应的索引。
答案 1 :(得分:1)
您的算法是正确的。但是,在您的示例中,概率不会达到1。
答案 2 :(得分:0)
该代码将起作用,但您的概率不会达到100%(因此,任何if语句都不可能匹配)。
通过使用累积概率分布可以简化该方法:
cumprob[5] = {.1, .2, .45, .50, 1.0};
这也允许你用lsearch替换if-elif链。
答案 3 :(得分:0)
您的算法使用随机浮点数进行离散分布,这不是实现此目的的最佳方法。您的实施可能会提供与给定分布几乎无法区分的分布,但它在科学上是不正确的。
相反,找到给定概率的最小公分母(在您的示例中为5%)并使用[0,19]中的随机整数来选择您的组。例如:
switch(random(19)) {
case 0:
case 1:
selection = 1;
break;
case 2:
case 3:
case 4:
selection = 2;
break;
case 5:
case 6:
case 7:
case 8:
case 9:
selection = 3;
break;
case 10:
selection = 4;
break;
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
case 19:
selection = 4;
break;
}