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.}