为了账号安全,请及时绑定邮箱和手机立即绑定

在C / C ++中按照正态分布生成随机数

在C / C ++中按照正态分布生成随机数

C++ C
收到一只叮咚 2019-08-30 17:56:37
如何在C或C ++中正常分布后轻松生成随机数?我不想使用Boost。我知道Knuth详细谈论了这个问题,但我现在还没有他的书。
查看完整描述

3 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

有许多方法可以从常规RNG生成高斯分布数。


该箱穆勒变换是常用的。它正确生成具有正态分布的值。数学很容易。您生成两个(统一)随机数,并通过对它们应用公式,您将获得两个正态分布的随机数。返回一个,并保存另一个以获取随机数的下一个请求。


查看完整回答
反对 回复 2019-08-30
?
慕森卡

TA贡献1806条经验 获得超8个赞

C ++ 11

C ++ 11提供的std::normal_distribution,这就是我今天要走的路。


C或更旧的C ++

以下是按复杂程度递增的顺序解决方案:


从0到1添加12个均匀随机数并减去6.这将匹配正常变量的均值和标准差。一个明显的缺点是范围限制在±6 - 与真正的正态分布不同。


Box-Muller变换。这在上面列出,并且实现起来相对简单。但是,如果您需要非常精确的样本,请注意Box-Muller变换与一些统一的生成器相结合会遭受称为Neave Effect 1的异常现象。


为了获得最佳精度,我建议绘制制服并应用反向累积正态分布来得到正态分布的变量。这是一个非常好的逆累积正态分布算法。


1. HR Neave,“使用具有乘法同余伪随机数发生器的Box-Muller变换”,Applied Statistics,22,92-97,1973


查看完整回答
反对 回复 2019-08-30
  • 3 回答
  • 0 关注
  • 1077 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信