根据分布生成随机数

时间:2010-08-18 09:05:49

标签: random distribution

我想根据某些发行版生成随机数。我怎么能这样做?

6 个答案:

答案 0 :(得分:17)

你得到的标准随机数生成器(在简单转换后在C中rand(),在许多语言中是等价的)是对范围[0,1]上的均匀分布的相当好的近似。如果这就是你所需要的,你就完成了。将它转换为在更大的整数范围内生成的随机数也是微不足道的。

将统一分布转换为正态分布为already been covered on SO,与Exponential distribution一样。

[编辑]:对于triangular distribution,转换统一变量相对简单(在类似C的情况下):

double triangular(double a,double b,double c) {
   double U = rand() / (double) RAND_MAX;
   double F = (c - a) / (b - a);
   if (U <= F)
      return a + sqrt(U * (b - a) * (c - a));
   else
      return b - sqrt((1 - U) * (b - a) * (b - c));
}

这只是转换维基百科页面上给出的公式。如果你想要别人,那就是开始寻找的地方;通常,您使用统一变量来选择所需分布的cumulative density function垂直轴上的点(假设它是连续的),并反转CDF以获得具有所需分布的随机值。

答案 1 :(得分:11)

正确的方法是将分布分解为n-1个二进制分布。那就是你有这样的发行版:

A: 0.05
B: 0.10
C: 0.10
D: 0.20
E: 0.55

您将其转换为4个二进制分布:

1. A/E: 0.20/0.80
2. B/E: 0.40/0.60
3. C/E: 0.40/0.60
4. D/E: 0.80/0.20

从n-1分布中均匀选择,然后根据二进制分布中的每一个的概率选择第一个或第二个符号。

Code for this is here

答案 2 :(得分:4)

实际上取决于发行量。最通用的方法如下。设P(X)是根据您的分布产生的随机数小于X的概率。

首先在0和1之间生成均匀的随机X.之后你会发现Y使得P(Y)= X并输出Y.你可以使用二分搜索找到这样的Y(因为P(X)是X的递增函数)。

这不是很有效,但适用于可以有效计算P(X)的分布。

答案 3 :(得分:4)

你可以查看逆变换抽样,拒绝抽样以及Devroye的书“Nonuniform random variate generation”/ Springer Verlag 1986

答案 4 :(得分:0)

您可以使用插值将离散分档转换为float / double。简单的线性效果很好。如果您的表格内存受到限制,则可以使用其他插值方法。 -jlp

答案 5 :(得分:-1)

这是标准教科书。有关某些代码,请参见here,有关某些参考数学背景(实际上非​​常快速且易于阅读),请参见第3.2节的here