我想根据一些分布生成随机数,该怎么做?
我想根据一些分布生成随机数,该怎么做?
您拥有的标准随机数生成器(在C语言中为rand()
经过简单转换后,在许多其他语言中也有相应的等价物)是对区间[0,1]上均匀分布的相当好的近似。如果这正是您所需要的,那么您已经完成了。将其转换为生成范围稍大的整数的随机数也非常简单。
将均匀分布转换为正态分布已经在SO上进行了讨论,转换为指数分布也是如此。
[编辑]: 对于三角分布,将均匀变量转换相对简单(类似于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));
}
U = ((double)rand()) / RAND_MAX
。否则,你的 sqrt((1 - U) ...) 将会是虚数。 - LarsH正确的方法是将该分布拆分为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 个分布中均匀地选择一个,然后根据二进制分布中每个符号的概率选择第一个或第二个符号。
实际上这取决于分布。最常见的方法如下:设P(X)为根据您的分布生成的随机数小于X的概率。
首先,您需要生成介于零和一之间的均匀随机变量X。接着,您需要找到Y,使得P(Y) = X,并输出Y。您可以使用二分查找来找到这样的Y(因为P(X)是X的递增函数)。
这种方法并不是非常高效,但对于可以有效计算P(X)的分布而言,是可行的。