2012-01-27 35 views
1

這個問題是不是關於如何使用任何語言在任何間隔之間生成一個隨機數。它是關於產生0或1。PC/Mac如何爲0或1生成隨機數?

據我所知,許多隨機發生器算法操縱非常基本隨機的(0或1)的功能和從用戶採取種子和使用算法根據需要產生各種隨機數。

的問題是,CPU即如何產生0或1?如果我投擲一枚硬幣,我可以產生頭部或尾部。那是因爲我身體投擲硬幣並讓自然決定。但CPU如何做呢?必須有動作 CPU(像投擲硬幣一樣)隨機獲得0或1,對嗎?

有人能告訴我嗎?

感謝

回答

1

(這有幾個方面,因此一些算法。請記住,有許多不同的形式用於不同目的的隨機性,但我明白,你有興趣在實際的方式你的問題用於密碼的隨機性。)

這裏的根本問題是,電腦是(主要)確定性的機器。如果在相同的狀態下輸入相同的數據,他們總會得到相同的結果。但是,有幾種實際收集熵的方法:

  1. 用戶輸入。由於用戶將外部輸入帶入系統,您可以從中獲取一些位。類似於你如何使用放射性衰減或線路噪聲。
  2. 網絡活動。再次,外部來源的東西。
  3. 通常中斷(包括前兩個)。
  4. 正如第一項中提到的那樣,可以使用來自外圍設備的噪音,例如音頻輸入或攝像頭。
  5. 有專用硬件可以產生每秒幾百M的隨機性。儘管如此,他們通常直接給你隨機數,而不是內部熵。

你到底如何從中導出位是你的,但你可以使用事件,或從事件等實際內容之間的時間 - 通常從熵源消除偏見是不容易的或微不足道,很多的思想和算法工作進入了這個過程(在上述特殊硬件的情況下,這全部用硬件完成,使用它的代碼不需要關心它)。

一旦你真正隨機比特池你可以用它們作爲隨機數(/dev/random在Linux確實是)。但是這有缺點,因爲實際的熵通常很小,並且對隨機數的需求可能更高。所以,你可以發明的算法「拉伸」,在一個方式,使得它仍然不可能或者至少很難預測約下面的數字(/dev/urandom在Linux或兩個/dev/random/dev/urandom在FreeBSD上做的)任何初始隨機性。 FortunaYarrow是所謂加密安全僞隨機數發生器和設計考慮到這一點。你仍然對你產生的隨機數的質量有很好的保證,但在你的熵池用完之前還有很多。

在任何情況下,CPU本身不能給你一個0或1的隨機數。涉及更多,這通常包括完整的計算機系統或專門爲此目的而構建的硬件。


還有一個第二級的計算隨機性:普通香草僞隨機數生成器(PRNG)。我之前說過的決定論 - 這是它的體現。給定相同的所謂的種子 PRNG將每次產生完全相同的數字序列1。雖然這聽起來很愚蠢,但它有實際的好處。

假設您運行了一個涉及大量隨機數的模擬,可能模擬分子或原子之間的相互作用,這涉及到某些概率和不可預知的行爲。在科學中,你需要任何人都可以獨立驗證的結果,給定相同的設置和程序(或者使用相同的算法)。如果你使用了實際的隨機性,你唯一的選擇就是保存每一個隨機數,以確保其他人可以獨立地複製結果。

但是使用PRNG,您只需保存種子並記住您使用的算法。其他人則可以獨立得到完全相同的僞隨機數序列。很不錯的屬性,使其具有:-)


腳註

¹這甚至包括上面提到的CSPRNGs,但它們被設計在包括定期重新播種熵一種特殊的方式來使用克服這個問題。

+0

感謝您的回答。所以你的意思是實際上CPU本身沒有或者不能真正產生一個0或1的隨機數。相反,無論如何,CPU需要一些外部因素來幫助隨機生成0或1。 – 2012-01-27 13:10:23

+0

確實。我想我現在只是用我的編輯添加了這句話。 – Joey 2012-01-27 13:13:43

+0

非常明確,謝謝 – 2012-01-27 13:38:09

0

一個CPU只能產生一個統一的隨機數U(0,1),其範圍從0到1.所以在數學上它將被定義爲一個隨機變量U,範圍在[0,1] 。在0到1範圍內的U(0,1)隨機數的隨機抽取的示例將是0.28100002,0.34522,0.7921等。在0和1之間的任何值的概率是相等的,即它們是等概率的。

如果U(0,1)< = 0.5,則將U(0,1)的隨機繪圖設置爲0,如果U(0,1)爲1,則可以生成0或1的二元隨機變量。 > 0.5,因爲從理論上講,U(0,1)隨機抽取的次數會低於0.5並且高於0.5。