C语言中的任意精度随机数生成:用于蒙特卡罗模拟而不受大气噪声影响。

3

我知道有其他类似的问题,然而以下问题涉及到在C语言中生成任意精度随机数以用于蒙特卡罗模拟。

如果没有大气噪音可用并且不依赖于会产生瓶颈的磁盘I/O或网络访问,我们如何在C语言中生成高质量的任意精度随机数呢?

libgmp可以生成随机数,但是,像其他实现伪随机数生成器一样,它需要种子。正如手册所提到的那样,“系统时间很容易被猜测,因此如果需要不可预测性,则绝不能是种子值的唯一来源。”

是否有一个可移植/移植的库用于生成随机数或随机数种子?libgmp还指出:“在一些系统上,有一个特殊的设备/dev/random,提供更适合用作种子的随机数据。” 但是,/dev/random/dev/urandom仅可用于*nix系统。


这是一个棘手的问题(也是一个活跃研究领域)。+1 蒙特卡罗模拟尤其棘手,因为即使数据具有高周期性,结果的变化也可能受到限制。 - WhirlWind
3个回答

2
根据定义,真正的随机数需要来自真实世界的混沌信息。/dev/random通常(但并非总是)提供此类信息。对于*ix,另一个选择是Entropy Gathering Demon。 /dev/urandom 的设计使其可以提供非随机数据,因为当熵池用尽时它不会阻塞。
提供此类服务的互联网API包括HotBits(放射性衰变),LavaRnd(CCD)和Random.org(大气噪声,我意识到您不想要这个)。另请参见硬件随机数生成器
这个 设备(与我无关)有Windows和*ix的驱动程序。

沿着这条线,您可能想研究硬件随机数生成器。然而,这需要对事业的极大奉献。 - zdav
这不需要变成另一个伪随机/随机数讨论。蒙特卡罗模拟所需的是具有非常大周期的伪随机数。 - WhirlWind

2

不要高估种子的重要性。

首先,它不需要真正混沌 - 只需要具有良好的分布,并且不与仿真或伪随机生成器中的任何过程相关联。

其次,对于蒙特卡罗统计特征很重要,而不是任何特定数字的随机性(在任何意义上)。

高精度时间的低字节或键盘鼠标操作的某些派生物对于任何定期运行在个人计算机上的内容都是一个很好的种子。


0

为什么需要任意精度要求?不存在“0到无穷大之间的随机数”。你总是需要一个范围。


2
你的问题可能应该作为对原始问题的评论发布。 - zdav
是的,需要一个范围。但是我不希望范围像在C语言中定义整数时那样被限制(例如,uint32_t被限制在0和UINT32_MAX之间),因此它不是“0到无穷大之间的随机数”,而是我想由我来定义范围。另外,假设我们有一个“真正”的随机数生成器,其输出在0和1之间具有包容性边界;如果我们取一定数量的输出,并将它们作为二进制数串联起来,它仍然是一个随机数;但是,我们选择了精度(例如,0101(2进制)= 5,使用4个输出)。 - Yktula

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接