1. 程式人生 > >關於真隨機數和偽隨機數

關於真隨機數和偽隨機數

來自知乎上 @納米黑客 的回答:
首先,「真隨機」也有不同的含義, 真正的真隨機目測只有量子力學了……一般的所謂真隨機不是指這個,而是指 統計意義 上的隨機,也就是具備不確定性,可以被安全的用於金融等領域,下面的真隨機也均指這個。
答案是, 計算機理論上可以產生統計意義上的真隨機數 。
大部分程式和語言中的隨機數(比如 C 中的,MATLAB 中的),確實都只是 偽隨機 。是由可確定的函式(比如線性同餘),通過一個種子(比如時鐘),產生的偽隨機數。這意味著:如果知道了種子,或者已經產生的隨機數,都可能獲得接下來隨機數序列的資訊(可預測性)。
直觀來想,計算機是一種可確定,可預測的的裝置,想通過一行一行的確定的程式碼自身產生真隨機,顯然不可能。但是, 我們或許可以迂迴一下 ……
一個典型的例子就是 UNIX 核心中的隨機數發生器(/dev/random),它在 理論上能產生真隨機 。即這個隨機數的生成,獨立於生成函式,或者說這個產生器是非確定的。
實現方法呢?簡單的講就是軟硬結合,或者說,引入系統外的變數(把軟體,程式碼,演算法想象成一個封閉的系統)。
具體來講,UNIX 維護了一個 熵池 ,不斷收集非確定性的裝置事件,即機器執行環境中產生的 硬體噪音 來作為種子。
比如說:IO請求的響應時間, 特定硬體中斷的時間間隔, 鍵盤敲擊速度,滑鼠移動速度,甚至周圍的電磁波等等……直觀的說, 你每按一次鍵盤,動一下滑鼠,鄰居家 wifi 訊號強度變化,磁碟寫入速度,等等訊號,都可能被用來生成隨機數 。
更具體的,核心提供了向熵池填充資料的介面
比如滑鼠的就是

void add_mouse_randomness(__u32 mouse_data)
核心子系統和驅動呼叫這個函式,把 滑鼠的位置和中斷間隔時間作為噪音源填充進熵池 。

Q 有的中斷有規律可循,或者可以受外界控制,怎麼辦
A 並非所有的中斷都能作為噪音源的。
所以,結論是, 程式和演算法本身不能產生真隨機,但是計算機系統作為整體可以迂迴產生統計意義上的真隨機 。

參考:

核心原始碼在/drivers/char/random.c
Windows 中也有相對的隨機數生成器,基本的思想是一致的
如果要求更高的話,也有專用的裝置,可收集附近的電磁場等環境噪音來產生隨機數

有關如何產生隨機數的理論有許多,如果要詳細地討論,需要厚厚的一本書的篇幅。

有限狀態機不能產生真正的隨機數的,所以在現在的計算機中並沒有一個真正的隨機數生成演算法,現有的隨機數生成演算法生產的隨機數只不過因為重複的週期比較大,可以做到使產生的數字重複率很低,這樣看起來好象是真正的隨機數,一般稱作叫偽隨機數發生器。

真正的隨機數是使用物理現象產生的:比如擲錢幣、骰子、轉輪、使用電子元件的噪音、核裂變等等。這樣的隨機數發生器叫做物理性隨機數發生器,它們的缺點是技術要求比較高。真隨機數生產效率沒有偽隨機數高,還有就是”資訊熵的資訊量如果很有限的話,就不是一定是真的隨機數了。”

還有人質疑真正的隨機數的存在,這是哲學問題,不在此涉及。

查了下現有的真隨機數生成器,比如PuTTYgen的隨機數是讓使用者移動滑鼠達到一定的長度,之後把滑鼠的運動軌跡轉化為種子;Intel通過電阻和振盪器來生成熱噪聲作為資訊熵資源;Unix/Linux的dev/random和/dev/urandom採用硬體噪音生成隨機數;(待補充)

基於特定Intel晶片組中random number generator(RNG)單元的真隨機數生成器.在Intel 815E晶片組的個人電腦上安裝Intel Security Driver(ISD)後,可以通過程式設計讀取暫存器獲取RNG中的隨機數.

有人在BBS上提到:RSA的書上介紹過一種隨機數發生器,根據的是劣質記憶體晶片工作在高溫下,其資料是不可預測的,讀取這裡面的資料,就會得到難以預測的隨機數。有采用這種技術製作隨機數發生器板卡。

關於Linux系統的真隨機數生成器在《Linux核心設計與實現》一書的附錄B中有詳細介紹
Linux自1.3.30版就在核心提供了真隨機數生成器,至少是理論上能產生真隨機數,它利用機器的噪音生成隨機數,噪音源包括各種硬體執行時速,使用者和計算機互動時速。比如擊鍵的間隔時間、滑鼠移動速度、特定中斷的時間間隔和塊IO請求的響應時間等。

此外還有提供真隨機數的網站,如:
1。 http://random.irb.hr/ 是一個免費為學術和科研機構提供真隨機數字服務的網站。全名是Quantum Random Bit Generator Service (QRBGS),由克羅埃西亞的電腦科學家開發。其隨機性依賴於半導體光子發散量子物理過程中內在的隨機性,光子通過光電效應進行檢測。這些隨機檢測到的光子都是相互獨立的。
可以通過C/C++庫、Web Service、Mathmatic/Matlab外掛等多種方式訪問。將來會提供基於SSL的安全訪問。
它甚至還有個小小的Erlang的客戶端訪問程式
http://code.google.com/p/qrbgerl/

  1. 還有http://random.org/,從1998年開始就在Internet上提供真隨機數服務了,它用大氣噪音生成真隨機數

有人還提到
用Java可以使用java.security.SecureRandom 產生真隨機數(待查);
Linux系統有/dev/random,/dev/urandom向用戶提供真隨機數;
Windows系統有CryptGenRandom 函式生成真隨機數(待查)

在《數字追凶 numb3rs》第6季中有一集是通過預測彩票所採用的偽隨機數演算法進行彩g票f詐w騙的。

2010年,德國研究人員開發出一種產生真隨機數的新方法,他們希望能改進網際網路安全。
隨機數是計算機和網際網路安全的重要組成部分,網站和瀏覽器利用一把會話鑰匙加密兩者之間傳送的資料。偽隨機數可以預測和破解,研究人員一直在研究能產生真正的、無法預測的隨機數方法。德國的研究團隊現在開發出一種真隨機數發生器,它使用的計算機記憶體雙態觸發器作為隨機的一個額外層,觸發器可隨機的在1或0狀態中切換,在切換之前,觸發器處於行為無法預測的“亞穩態”。在亞穩態結束時,記憶體中的內容為完全隨機。研究人員對一個觸發器單元陣列的實驗顯示,這種方法產生的隨機數比傳統方法“隨機”約20倍。

經典物理學不存在真正的隨機性,而量子世界從本質上講就是真正隨機的,是不可預測的。根據發表在2010年4月最新一期《自然》雜誌上的報告,比利時物理學家S. Pironio和同事利用“遠距離的幽靈般作用”創造出了真隨機數。

2011年,加拿大渥太華的物理學家Ben Sussman利用鐳射脈衝和鑽石創造了真隨機數。用真隨機數編碼的資訊將難以被黑客破解。
Sussman的實驗室使用持續幾萬億分之一秒的鐳射脈衝照射鑽石,鐳射進入和出來的方向發生了變化。Sussman稱改變與量子真空漲落的相互作用有關,量子力學與大多數物理學法則不同,不可能知道真正發生了什麼。他認為這可以用於創造真正的隨機數。

2012年,史上最快的隨機數生成器:從真空中的亞原子噪音獲取隨機數
量子力學告訴我們亞原子對會持續自發的產生和湮滅,即使是在真空裡也一樣。通過監聽真空內亞原子粒子量子漲落產生的噪音,澳大利亞國立大學的科學家們建造了世界上最快的隨機數發生器。研究小組開發了可以通過鐳射監聽真空中隨機噪音的工具並以此產生真正的隨機數。

隨機數生成網頁

DOTA裡斧王的反擊螺旋等採用的是偽隨機。。。。。。