2010-05-23 58 views
3

我知道还有其他类似于这个问题的问题,但是下面的问题涉及在C中用于蒙特卡洛的任意精度随机数生成模拟。C:中的任意精度随机数用于无大气噪声的蒙特卡罗模拟

如何在不依赖可能产生瓶颈的磁盘I/O或网络访问的情况下,在大气噪声不总是可用的情况下,用C语言生成高质量的任意精度随机数?

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

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

+0

这是一个棘手的问题(也是一个积极的研究领域)。 +1 Monte Carlo模拟问题尤其突出,因为即使数据的高周期性也会限制结果的变化。 – WhirlWind 2010-05-23 22:05:55

回答

2

不要高估种子的重要性。首先,它不需要是真正的混沌 - 只是为了具有良好的分布,而不是与仿真或伪随机生成器中的任何过程相关。其次,对于蒙特卡洛统计特性而言,并不是随机性(在任何意义上)具体数字。

高精度时间的低字节或键盘 - 鼠标动作的某些派生为任何将在常规PC上运行的任何东西构成良好的种子。

2

根据定义,真随机数需要来自现实世界的混沌信息。/dev/random经常(但不总是)提供这个。 * ix的另一个选项是Entropy Gathering Demon。/dev/urandom在设计时会高兴地提供非随机数据,因为它不会在熵池耗尽时阻塞。提供此功能的互联网API包括HotBits(放射性衰减),LavaRnd(CCD)和Random.org(我认识到您不想要的大气噪声)。另请参阅Hardware random number generator

device(无隶属关系)具有Windows和* ix的驱动程序。

+0

沿着这条线,你可能想看看硬件随机数发生器。然而,这需要对事业做出极大的奉献。 – zdav 2010-05-23 22:19:18

+0

这并不需要退化为另一个伪随机/随机数讨论。蒙特卡洛模拟需要的是具有非常大的周期的伪随机数。 – WhirlWind 2010-05-24 02:20:26

0

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

+2

您的问题可能应该已发布为原始问题的评论。 – zdav 2010-05-23 22:38:01

+0

是的,一个范围是必需的。但是,我不希望范围在C中定义一个整数时(例如,uint32_t被绑定在0和UINT32_MAX之间)的方式有界,所以它不是“0和无穷大之间的随机数” ,但我希望范围由我定义。另外,假设我们有一个“真正的”随机数生成器,它的输出包含在0和1之间;如果我们输出一定数量的输出,它仍然是一个随机数,并且将一个连接读作一个二进制数;然而,我们选择了精度(例如0101(基数2)= 5,4输出)。 – Yktula 2010-05-24 01:54:54