標籤:使用 os for 代碼 時間 new
預設情況下,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,"隨機數測試");
程式最終運行如下: