以往大家有個***識,就是計算機不能產生真隨機數,其實這是對計算機認識不夠造成的,計算機有多種產生隨機數的方法,這裏僅舉壹例:
最常用的C語言中有些函數的特點是每次調用它執行時間不壹樣,也就是執行時間有壹定的隨機性,利用此特性我們可以得到所需要的隨機數。這些函數有Beep(0,0),SetWindowText(NULL),MessageBeep(MB_ICONQUESTION)等,其它語言的函數也有類似情況是肯定的。
我們只要連續調用此類函數,監測其執行時間,處理執行時間就可以達到目的。但函數的執行時間都是很短暫的,用壹般測量時間的方法都太粗糙了,必須自己設計度量方法。每個計算機都有其工作頻率稱為主頻,與之相對應的是時鐘周期,做壹個函數讀取計算機運行以來的時鐘周期,用函數運行時計算機所經歷的周期數來度量時間;測量壹下當前的周期數,讓函數運行,再測量壹下當前的周期數,兩個周期數的差值再減去壹個本底值就代表了函數運行時間,如此做多個循環就可以大量采集運行時間了,處理運行時間數組得到隨機數組。
且看實驗數據:
Beep(0,0)函數的運行時間115636,114283,114899,115030,114488,114350,114866,115132,114317,114757
放在字數組裏則有 50100,48747,49363,49494,48952,48814,49330,49596,48781,49221
放在字節數組裏則有 180,107,211,86,56,174,178,188,141,69
顯然放到16位的字數組裏效果不好,這是因為函數運行時間只比16位的最大值大0.7倍左右。但放到8位數組裏效果不錯,而其它位數的數據由此組合即可。
通過生成大量數據的檢測還沒有發現周期現象,也就是從不重復的,數組長度大時所有元素等概率出現隨機性良好,所以它們是真隨機數。
這裏展示了程序連續生成大隨機數:/s/1Dphz