首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >伪随机数生成器-指数分布

伪随机数生成器-指数分布
EN

Stack Overflow用户
提问于 2010-01-21 10:23:50
回答 6查看 76.2K关注 0票数 64

我想生成一些伪随机数,到目前为止,我对.Net库的Random.Next(int min, int max)函数非常满意。这种类型的Exponential Distribution应该使用Uniform distribution,但我非常希望使用PRNG生成一些数字。

我正在用C#编程,尽管我会接受伪代码或C++、Java或类似的语言。

有什么建议/代码片段/算法/想法吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-01-21 10:44:10

由于您可以访问统一的随机数生成器,因此使用inversion method可以很容易地生成与您知道其CDF的其他分布一起分布的随机数。

因此,在[0,1)中生成一个均匀随机数u,然后通过以下方法计算x

x = log(1-u)/(-λ)

其中λ是指数分布的速率参数。现在,x是一个具有指数分布的随机数。请注意,上面的log是自然对数ln

票数 111
EN

Stack Overflow用户

发布于 2010-01-21 10:44:58

抽样的基本定理认为,如果你能对期望的分布进行归一化、积分和倒置,你就可以自由地回家了。

如果您在[a,b]上标准化了所需的分布F(x)。你可以计算

代码语言:javascript
复制
C(y) = \int_a^y F(x) dx

将其反转以获得C^{-1},在[0,1]上均匀抛出z并查找

代码语言:javascript
复制
x_i = C^{-1}(z_i)

它将具有所需的分布。

在你的例子中:F(x) = ke^{-kx}和我将假设你想要[0,infinity]。我们得到:

代码语言:javascript
复制
C(y) = 1 - e^{-ky}

它是可逆的,给出

代码语言:javascript
复制
x = -1/k  ln(1 - z)

对于在[0,1)上均匀抛出的z。

但是,坦率地说,使用经过良好调试的库更聪明,除非您是为了自己的启迪而这样做。

票数 16
EN

Stack Overflow用户

发布于 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)/(λ);

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2106503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档