我想根据某些发行版生成随机数。我怎么能这样做?
答案 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分布中均匀选择,然后根据二进制分布中的每一个的概率选择第一个或第二个符号。
答案 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)