1. 程式人生 > >使用kbmmw中的隨機數替換delphi 10.3 自帶的隨機數

使用kbmmw中的隨機數替換delphi 10.3 自帶的隨機數

中心 密碼 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 自帶的隨機數