我想生成一些伪随机数,到目前为止,我对.Net库的Random.Next(int min, int max)
函数非常满意。这种类型的Exponential Distribution应该使用Uniform distribution,但我非常希望使用PRNG生成一些数字。
我正在用C#编程,尽管我会接受伪代码或C++、Java或类似的语言。
有什么建议/代码片段/算法/想法吗?
发布于 2010-01-21 10:44:10
由于您可以访问统一的随机数生成器,因此使用inversion method可以很容易地生成与您知道其CDF的其他分布一起分布的随机数。
因此,在[0,1)
中生成一个均匀随机数u
,然后通过以下方法计算x
:
x = log(1-u)/(-λ)
,
其中λ
是指数分布的速率参数。现在,x
是一个具有指数分布的随机数。请注意,上面的log
是自然对数ln
。
发布于 2010-01-21 10:44:58
抽样的基本定理认为,如果你能对期望的分布进行归一化、积分和倒置,你就可以自由地回家了。
如果您在[a,b]
上标准化了所需的分布F(x)
。你可以计算
C(y) = \int_a^y F(x) dx
将其反转以获得C^{-1}
,在[0,1]上均匀抛出z
并查找
x_i = C^{-1}(z_i)
它将具有所需的分布。
在你的例子中:F(x) = ke^{-kx}
和我将假设你想要[0,infinity]
。我们得到:
C(y) = 1 - e^{-ky}
它是可逆的,给出
x = -1/k ln(1 - z)
对于在[0,1)
上均匀抛出的z。
但是,坦率地说,使用经过良好调试的库更聪明,除非您是为了自己的启迪而这样做。
发布于 2020-12-21 22:01:52
这是我在维基百科上找到的公式:
T= -Ln(u) /λ
我们创建一个在0,1中具有均匀分布(u)的随机数,我们得到x:
Random R= new Random();
double u= R. NextDouble();
双x= -Math.Log(u)/(λ);
https://stackoverflow.com/questions/2106503
复制相似问题