在程序開發中,我們經常會用到隨機數,確保某個事件發生是具有隨機性,不可預測性的。而事實是隨機性卻不是那么隨機,我們大多用的都是偽隨機數。那什么才是真隨機數呢?
信息熵
什么是熵?在物理學中,熵(entropy)是一個描述系統混亂程度的物理量,熵越大說明系統越無序、越混亂,不確定性越大。例如:一杯水,所有的水分子都是聚集在一起叫低熵,把這杯水靜置一段時間,水分子擴散出處,彌漫到整個房間,這個過程叫熵增。整個宇宙事實上都在做熵增的運動。而人可能喜歡有序,盡量把物體放置整齊,垃圾分類處理,減少熵的增加,讓世界整齊有序活動,喜歡可預測可掌控生活。
那么什么是信息熵?信息熵是描述信息的復雜程度,信息克服了多大的不確定性。例如:abcdefgh..... 我們很容易推測到后面應該是ijklmn,例如數列: 1 1 2 3 5 8 13.... 我們也容易知道后面的數是21。這些都是可預測性的規律,信息熵就比較低。同樣的一本書,英文版本的書信息熵比較低,而中文版的信息熵比較高。因為英文有大量介詞,定冠詞等字母。即時去掉一兩個也同樣能理解這句話的意思,但是同樣的一句話中文表達的信息量就遠大於英文。古代的文言文信息熵就遠大於今天的漢語,因為文言文的信息熵比較高,這也是省了不少竹簡呀!同樣高效的語言文本,最高效的信息熵應該是亂碼,雜亂無章,沒任何規律可循。列如:服務器密鑰文件,比特幣、以太坊私鑰的生成都已經克服了很大的不確定性,足夠混亂,至少現在看來是安全的。
隨機數
在Linux內核中采用熵來描述數據的隨機性。為了能產生足夠高效隨機數,Linux系統維護了一個專門用於收集噪聲的熵池(entropy pool),熵池的信息來自外界的熵信息 如:設備驅動的噪音,鼠標點擊的聲音,設備風扇運作的噪音。將這些噪聲收集起來被用於產生真正的隨機數。如果熵池中沒有足夠的噪音資源,就需要等待熵池的收集。只要設備的物理混亂程度越大,熵增就越快,熵池的信息越飽和,隨機性的效率就越高。
 
        