3

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

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

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

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

4

3 回答 3

2

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

提供此功能的 Internet API 包括HotBits(放射性衰变)、LavaRnd (CCD) 和Random.org(我知道您不想要的大气噪声)。另请参阅硬件随机数生成器

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

于 2010-05-23T22:14:33.907 回答
2

不要高估种子的重要性。

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

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

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

于 2010-05-25T06:37:55.323 回答
0

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

于 2010-05-23T22:20:53.357 回答