我想根据一些分布生成随机数。我该怎么做?
您拥有的标准随机数生成器(C 语言中的
rand()
,经过简单转换后,在许多语言中等效)是对 [0,1] 范围内均匀分布的相当好的近似。如果这就是您所需要的,那么您就完成了。将其转换为在更大的整数范围内生成的随机数也很简单。
SO 已经涵盖了均匀分布到正态分布的转换,以及指数分布。
[编辑]:对于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));
}
这只是转换维基百科页面上给出的公式。如果你想要其他的,那就从那里开始寻找;一般来说,您使用uniform变量在您想要的分布的
首先生成 0 到 1 之间的均匀随机 X。之后,您找到 Y,使得 P(Y) = X 并输出 Y。您可以使用二分搜索找到这样的 Y(因为 P(X) 是 X 的递增函数)。
这不是很有效,但适用于可以有效计算 P(X) 的分布。
非均匀随机变量生成”/Springer Verlag 1986
不同方法的概述:
https://docs.scipy.org/doc/scipy/reference/stats.sampling.html
教程:https://docs.scipy.org/doc/scipy/tutorial/stats/sampling.html
如果您使用 R,Runuran 中提供了非常相似的功能 (https://CRAN.R-project.org/package=Runuran)。
C 库 UNURAN:here 了解一些代码,或参阅 here 第 3.2 节了解一些参考数学背景(实际上非常快速且易于阅读)。