天天看點

c#中的随機數

預設情況下,C#中的僞随機數生成器Random是根據系統時間來設定其種子的。

Random rd = new Random();

int randNum=rd.next(1,101)

若我們采用預設的方式,對Random進行初始化的時候不賦予任何參數,其随機種子便采用系統時間。如果我們用循環一次生成多個随機數,由于CPU運算速度太快了,是以每次取到的都是同一個時間,即生成的随機數都會一樣,是以每次生成随機數之前需要更換随機數種子。

對于這種情況,我們可以采用加密随機數生成器來生成不同的種子,每次需要生成随機數的時候為Random賦予不同的種子,即使在很短的時間内也可以保證生成的随機數不同。具體代碼如下:

/// <summary>

/// 加密随機數生成器,生成随機種子

/// </summary>

/// <returns></returns>

private static int Chaos_GetRandomSeed()

{

    byte[] bytes = new byte[4];

    System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();

    rng.GetBytes(bytes);

    return BitConverter.ToInt32(bytes, 0);

}

 生成随機數的時候,每次将生成的随機數種子作為參數初始化Random即可,代碼如下:

//用消息框輸出十個随機數

string strMSG = "";           

for (int i = 0; i < 10; i++)

{

    //每次生成随機數的時候都使用機密随機數生成器來生成種子,

    //這樣即使在很短的時間内也可以保證生成的随機數不同

    Random rdm = new Random(Chaos_GetRandomSeed());

    //擷取一個10到30之間的随機數

    int iRand = rdm.Next(10, 300);

    strMSG += iRand.ToString() + " ";               

}

MessageBox.Show(strMSG,"随機數測試");

 程式最終運作截圖如下: