【问题标题】:Arbitrary-precision random numbers in C: generation for Monte Carlo simulation without atmospheric noiseC中的任意精度随机数:生成无大气噪声的蒙特卡罗模拟
【发布时间】:2023-12-21 21:31:01
【问题描述】:

我知道还有其他类似的问题,但是以下问题与 C 中用于蒙特卡罗模拟的任意精度随机数生成有关。

当大气噪声并不总是可用时,我们如何在 C 中生成高质量的任意精度随机数,而不依赖会造成瓶颈的磁盘 i/o 或网络访问?

libgmp 能够生成随机数,但是,like other implementations of pseudo-random number generators,它是requires a seed。正如手册中提到的,“系统时间很容易猜测,所以如果需要不可预测性,那么它绝对不应该是种子值的唯一来源。”

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

【问题讨论】:

  • 这是一个棘手的问题(也是一个积极研究的领域)。 +1 蒙特卡洛模拟尤其成问题,因为即使数据的高周期性也会限制结果的变化。

标签: c random simulation gmp


【解决方案1】:

根据定义,真正的随机数需要来自现实世界的混沌信息。 /dev/random 经常(但不总是)提供这个。 *ix 的另一个选项是Entropy Gathering Demon。 /dev/urandom 按照设计将很乐意提供非随机数据,因为当熵池耗尽时它不会阻塞。

提供此功能的 Internet API 包括 HotBits(放射性衰变)、LavaRnd(CCD)和 Random.org(我知道您不想要的大气噪声)。另见Hardware random number generator

device(无从属关系)拥有适用于 Windows 和 *ix 的驱动程序。

【讨论】:

  • 沿着这条线,您可能想要研究硬件随机数生成器。但是,这需要对这项事业做出极大的奉献。
  • 这不需要退化为另一个伪随机/随机数讨论。蒙特卡洛模拟需要的是具有非常大周期的伪随机数。
【解决方案2】:

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

【讨论】:

  • 您的问题可能应该作为对原始问题的评论发布。
  • 是的,需要一个范围。但是,我不希望范围以在 C 中定义整数时的方式受限(例如,uint32_t 绑定在 0 和 UINT32_MAX 之间),因此它不是“0 到无穷大之间的随机数” ,但我希望范围由我定义。另外,假设我们有一个“真正的”随机数生成器,它的输出包含在 0 和 1 之间;如果我们取一定数量的输出,并将串联读取为二进制数,它仍然是一个随机数;但是,我们选择了精度(例如 0101(base 2)=5 with 4 个输出)。
【解决方案3】:

不要高估种子的重要性。

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

其次,对于蒙特卡洛统计特征而言,与特定数字的随机性(在任何意义上)无关。

高精度时间的低字节或键盘鼠标操作的某些衍生为将在普通 PC 上运行的任何东西提供了良好的种子。

【讨论】: