【发布时间】:2021-08-06 23:30:35
【问题描述】:
我正在使用标准 c 库中的 rand() 函数为蒙特卡罗模拟生成 0 到 1 范围内的数字:
(double)rand()/RAND_MAX
但我注意到结果略有偏差。我检查了生成的数字平均在哪个值,它略低于预期的 0.5。
我读到 rand() 是模数偏向的,但我在这里没有使用模数。有没有更精确的方法来生成 1 到 0 之间的数字?
编辑: 我对 Prngs 还很陌生,所以我不知道有些 prngs 不是线程安全的。我应该提到我使用了 rand() 多线程。 无论如何,您的回答帮助我找到了更快且线程安全的 rng。
【问题讨论】:
-
即使在理想情况下,恰好达到 0.5 的可能性也不大,多少个数字会相差多少?
-
在十亿次以上的迭代中,它的平均值约为 0.495,以我的结果显着偏向为准。经过更多研究后,如果在欧洲核子研究中心的 prngs 论文中发现了这一点:luscher.web.cern.ch/luscher/ranlux
-
您使用了哪个标准 C 库?你是如何计算平均值的?显示您的代码。
-
如果您足够关心随机性来衡量其质量,请不要使用
rand()。 -
Stack Overflow 不仅适合您。为自己找到一些解决方案对您有好处。但是仍然存在一个问题,无论您使用的
rand似乎都有偏见。这是应该为未来的读者澄清的信息。告诉我们您使用哪个标准 C 库 C。GNU C 库?其他图书馆?你是如何计算平均值的?编辑问题以说明使用的库并包含代码。
标签: c random montecarlo