在C#中,默認的隨機數構造函數是以當前時間作為隨機數種子的,這帶來一個問題,例如有下面的生成隨機數的函數
private int GetRandom()
...{
Random r = new Random();
return r.Next(0, 1000);
}
如果使用下面的方式獲取隨機數:
int[] rs = new int[10];
for(int i = 0; i < 10; i++)
rs[i] = GetRandom();
一般情況下你獲取的10個隨機數是一模一樣的,因為時間間隔太短,用的隨機數種子都一樣嘛。對於同樣的隨機數種子,也就只好生成相同的隨機數了。
可以使用Thread.Sleep()方法延遲一下,使用每次隨機數種子不一樣,如下所示:
private int GetRandom()
...{
Thread.Sleep(25);
Random r = new Random();
return r.Next(0, 1000);
}
等待的時間還不能太短,不然仍然會獲得相同的隨機數序列。
這樣的解決方法顯示不合適,因為如果生成大批量的隨機數的話,時間全部都浪費在等待上了,其實可以定義一個自增的數字作為種子,如下所示:
private static int _RandomSeed = (int)DateTime.Now.Ticks;
private int GetRandom()
...{
if (_RandomSeed == int.MaxValue)
_RandomSeed = 1;
Random r = new Random(_RandomSeet++);
return r.Next(0, 1000);
}
這樣就能每次都獲取到不同的隨機數序列了。