隨機種子

我們經常說的隨機數,可是隨機數是如何產生的呢?


Random a = new Random(47)



僞隨機數是以一個稱爲“種子”的數作爲初始條件,通過固定的算法產生一個看上去像是隨機產生的數字序列的。


舉例來說,這個算法可以設計成類似於“將給定的種子開平方,取有效數字的第2至9位作爲下一次迭代的種子,重複此過程3次後,以結果的第1-4位作爲返回值、並將該結果作爲下次調用本過程的種子”等等。

然而,無論這個算法如何複雜,只要它固定不變,則對於相同的種子來說,每一次從這個種子開始、第n次通過該算法取得的僞隨機數卻總是一樣的,因此必須再通過各種真正客觀的途徑使得該初始的種子不同。一般來說常用的方式是以運行時候的時鐘時間,經一定變化後作爲初始的種子的。



一般種子可以以當前的系統時間,這是完全隨機的
算法1:平方取中法。
1)將種子設爲X0,並mod 10000得到4位數
2)將它平方得到一個8位數(不足8位時前面補0)
3)取中間的4位數可得到下一個4位隨機數X1
4)重複1-3步,即可產生多個隨機數
這個算法的一個主要缺點是最終它會退化成0,不能繼續產生隨機數。
算法2:線性同餘法
1)將種子設爲X0,
2)用一個算法X(n+1)=(a*X(n)+b) mod c產生X(n+1)
一般將c取得很大,可產生0到c-1之間的僞隨機數
該算法的一個缺點是會出現循環。
windows平臺下,可以考慮將如下參數作爲影響種子的因素。
⒈GetTickCount()
系統啓動以來的嘀嗒時間
說明:該時間與系統運行時長相關,
⒉GetCurrentProcessId()
當前進程Id號
說明:該Id與系統啓動進程數量及次序有關,一般波動範圍較小。
⒊GetCurrentProcess()
當前進程句柄
說明:該句柄實質就是內存地址,但每次進程啓動時地址值是不確定的。
⒋GetProcessTimes()
進程時間參數
說明:-
⒌GetCurrentThreadId()
當前線程Id號
⒍GetCurrentThread()
當前線程句柄
⒎GetThreadTimes()
線程時間參數
⒏GetCurrentHwProfile()
Profile配置文件
⒐GetSysColor()
系統Color
⒑GetSystemInfo()
⒒GetSystemPowerStatus()
電源狀態
⒓GetKeyboardState()
鍵盤狀態
⒔GlobalMemoryStatus()
內存狀態
⒕time()
當前時間 秒
⒖GUID
各硬件設備GUID
⒗MAC
網卡mac
⒘CPUID
CPU Id號
⒙聲卡錄音噪音
該參量與環境相關
⒚用戶鍵盤間隔時間
該參量與用戶習慣相關
其次,盡最大可能增加這些因素的維度。這裏說的維度是指
種子結果與因素之間的關聯程度。一般使用hash函數對多個
因素進行哈希運算。這樣得到的種子具有較強的散列特性。
通過以上技術手段得到的種子產生的僞隨機數是具有較好
統計特性的,它不依賴於某一臺機器,某一時刻,某一方法,
而是複雜多變、讓人捉摸不透難於重現的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章