使用kbmmw中的隨機數替換delphi 10.3 自帶的隨機數
阿新 • • 發佈:2019-03-02
中心 密碼 time 函數 del 算法 cati 集中 alt
我們在開發中經常會使用隨機數模擬各種隨機條件,例如生成唯一的密碼和令牌。
在計算機中,一般采用PRNG(偽隨機序列發生器)模擬真實隨機數。既然是隨機,就要要沒有任何規律,
在取值範圍內均勻、獨立。以確保盡量不重復。否則生成的密碼和令牌碰撞的幾率就非常大。
delphi自帶的隨機數函數,看似隨機,實際上當產生次數足夠多的話,就會發現重復性非常大,而且向中心域
集中。如果我們用delphi自帶的隨機數生成一個區域的點,就會很方便的發現這個問題。
kbmmw 5.8裏面 提供了好幾種流行的隨機數生成實現。例如PCG、 Mersenne Twister、SplitMix、Xoroshiro等。
甚至提供了幾個利用CPU 自身功能生成偽隨機數的函數。
我們可以明顯的看出來,這兩個圖中的點非常隨機、均勻。因此,我們在開發中盡量使用kbmmw 提供的隨機函數。
喜大普奔,delphi10.3 裏面提供了可替換隨機數生成的功能。
我們可以很方便的讓delphi 不用更改代碼(或者沒有代碼的情況一下),就可以享受這些好的功能和算法。
首先,我們做一個函數,當然記住要引用kbmMWRandom。
function xalionrandom32:UInt32; begin result:= kbmMWRandom32.Random; end;
然後在工程文件裏面加上三行。
Application.Initialize; //加上這三行 {$IF CompilerVersion >= 33} Random32Proc:= xalionrandom32; {$ENDIF}
ok, 我們的程序就可以享受這個福利了。
使用kbmmw中的隨機數替換delphi 10.3 自帶的隨機數