1. 程式人生 > >C#(.Net)平臺下生成隨機數方法的小結

C#(.Net)平臺下生成隨機數方法的小結

最近在做一些工作,需要用到一些隨機數來確保生出出來的串號唯一。

開始,很簡單地使用System.Random類來生成隨機數。很快,問題就來了,發現當random的生成間隔小於1ms時,隨機數就重複了(僅限於每次都新建Random物件),因為新建random時候是預設以當前時間作為隨機種子的。將random改為單例,重複數的機率小了,但是隨機數在一段時間後迴圈了(偽隨機數嘛,沒辦法,要求不了這麼多的)。

所以,特意在網上找了一些資料,並親自作了一些效能比較,在此作些總結。

  1. System.Random

    這個是偽隨機數生成器

    缺點:生成出來的結果會迴圈,且Random物件建立間隔小於1ms的時候產生結果會相同;
    優點:生成速度極快;
    效率:高,同一個物件產生1,000,000個結果只需要22ms(不含物件建立時間)

  2. System.Security.Cryptography.RandomNumberGenerator

    這個是用於產生密碼的安全隨機數生成器,產生出來的隨機數離散度高,產生1,000,000個32位(8-byte)的隨機數無重複

    缺點:速度很慢,對比System.Random是兩個數量級的效率差距;
    優點:安全度高,產生的結果可看作環境無關,而且可以填充任意長度的位元組陣列;
    效率:低,同一個物件產生1,000,000個結果需要4221ms(不含物件建立時間)

  3. System.Guid

    這個是GUID(UUID)生成器,出來的是128-bit的位元組陣列,通常被表示為8-4-4-4-12的32個hex字元。

    缺點:生成長度一定,而且生成出來的結果可能與環境相關,在高安全需求的環境不適用;
    優點:有強大的數學理論支援,在每秒產生10億筆UUID的情況下,100年後只產生一次重複的機率是50%;
    效率:中,產生1,000,000個結果需要255ms(包含Guid物件建立時間)

以上3個都可以當作隨機數產生器,但相對於大部分的業務需求, GUID(UUID)已經適用,而且其碰撞機率在同一個系統內幾乎是不可能的。所以在選擇產生器時GUID是一個不錯的選擇。