Random 具有非均匀离散密度的随机数
只是想知道这是什么类型的算法,Random 具有非均匀离散密度的随机数,random,non-uniform-distribution,Random,Non Uniform Distribution,只是想知道这是什么类型的算法, 或者,如果有一种更简单/更有效的方法: 假设我们给定了一定的概率密度 prob[] = {.1, .15, .25, .05, .45} 第1组-10% 第2组-15% 第3组-25% 第4组-5% 第5组-45% 和一个随机数,(0,1), ran=.853234 插入5组中的一组 if (ran <=prob[0]) selection = 1; else if (ran <= prob[0]+prob[1]) selection = 2;
或者,如果有一种更简单/更有效的方法: 假设我们给定了一定的概率密度
prob[] = {.1, .15, .25, .05, .45}
第1组-10%第2组-15%
第3组-25%
第4组-5%
第5组-45% 和一个随机数,(0,1),
ran=.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;
if(ran您的算法是正确的。但是,在您的示例中,概率加起来不等于1。除了概率加起来不等于100%之外,该代码将起作用(因此,所有if语句都不可能匹配)
通过使用累积概率分布,可以稍微简化该方法:
cumprob[5] = {.1, .2, .45, .50, 1.0};
这也可以替代if elif链。您的算法对离散分布使用随机浮点数,这不是实现这一点的最佳方式。您的实现可能提供的分布与给定的分布很难区分,但在科学上并不正确
相反,找到给定概率的最小公分母(在您的示例中为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;
}
你在这里所做的基本上是反转。假设F
是具有给定分布的随机变量X
的CDF,那么它被定义为F(X)==p[X
P[F^-1(U) <= x] == P[U <= F(x)] == F(x) == P[X <= x]
CDF[] = {.1, .25, .5, .55, 1.}