2010-05-23 59 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