真隨機(jī)數(shù)的定義是什么
真隨機(jī)數(shù)一般都是相對(duì)于數(shù)組而言,真隨機(jī)數(shù)就是沒(méi)有規(guī)律的數(shù),你不能預(yù)見(jiàn)其下一個(gè)數(shù)值是多少,真隨機(jī)數(shù)是個(gè)詭異的東西,一個(gè)源于物理現(xiàn)象得到的真隨機(jī)數(shù)組一經(jīng)公開(kāi)就不再是真隨機(jī)數(shù)組了,因?yàn)榈玫綌?shù)組的人都可以知道下一個(gè)數(shù)是什么。
以往大家有個(gè)共識(shí),就是計(jì)算機(jī)不能產(chǎn)生真隨機(jī)數(shù),其實(shí)這是對(duì)計(jì)算機(jī)認(rèn)識(shí)不夠造成的,計(jì)算機(jī)有多種產(chǎn)生隨機(jī)數(shù)的方法,這里僅舉一例:
最常用的C語(yǔ)言中有些函數(shù)的特點(diǎn)是每次調(diào)用它執(zhí)行時(shí)間不一樣,也就是執(zhí)行時(shí)間有一定的隨機(jī)性,利用此特性我們可以得到所需要的隨機(jī)數(shù)。這些函數(shù)有Beep(0,0),SetWindowText(NULL),MessageBeep(MB_ICONQUESTION)等,其它語(yǔ)言的函數(shù)也有類似情況是肯定的。
我們只要連續(xù)調(diào)用此類函數(shù),監(jiān)測(cè)其執(zhí)行時(shí)間,處理執(zhí)行時(shí)間就可以達(dá)到目的。但函數(shù)的執(zhí)行時(shí)間都是很短暫的,用一般測(cè)量時(shí)間的方法都太粗糙了,必須自己設(shè)計(jì)度量方法。每個(gè)計(jì)算機(jī)都有其工作頻率稱為主頻,與之相對(duì)應(yīng)的是時(shí)鐘周期,做一個(gè)函數(shù)讀取計(jì)算機(jī)運(yùn)行以來(lái)的時(shí)鐘周期,用函數(shù)運(yùn)行時(shí)計(jì)算機(jī)所經(jīng)歷的周期數(shù)來(lái)度量時(shí)間;測(cè)量一下當(dāng)前的周期數(shù),讓函數(shù)運(yùn)行,再測(cè)量一下當(dāng)前的周期數(shù),兩個(gè)周期數(shù)的差值再減去一個(gè)本底值就代表了函數(shù)運(yùn)行時(shí)間,如此做多個(gè)循環(huán)就可以大量采集運(yùn)行時(shí)間了,處理運(yùn)行時(shí)間數(shù)組得到隨機(jī)數(shù)組。
且看實(shí)驗(yàn)數(shù)據(jù):
Beep(0,0)函數(shù)的運(yùn)行時(shí)間115636,114283,114899,115030,114488,114350,114866,115132,114317,114757
放在字?jǐn)?shù)組里則有 50100,48747,49363,49494,48952,48814,49330,49596,48781,49221
放在字節(jié)數(shù)組里則有 180,107,211,86,56,174,178,188,141,69
顯然放到16位的字?jǐn)?shù)組里效果不好,這是因?yàn)楹瘮?shù)運(yùn)行時(shí)間只比16位的最大值大0.7倍左右。但放到8位數(shù)組里效果不錯(cuò),而其它位數(shù)的數(shù)據(jù)由此組合即可。
通過(guò)生成大量數(shù)據(jù)的檢測(cè)還沒(méi)有發(fā)現(xiàn)周期現(xiàn)象,也就是從不重復(fù)的,數(shù)組長(zhǎng)度大時(shí)所有元素等概率出現(xiàn)隨機(jī)性良好,所以它們是真隨機(jī)數(shù)。