設定亂數種子來產生真正不重覆的亂數

.NET亂數在使用的方式上,會有一個容易犯下的錯誤,那就是你真的用System.Random去產生一個新的實體後,事實上你的亂數種子(亂數因子)都是一樣的,這意味著你之後所有產生的亂數將會跟之前的一模一樣,只是很多人都沒有察覺到。這就是為何MSDN上面的Random建構子會有一個Random(Int32)的多載(Overloading)。但不幸的是,MSDN推薦的DateTime.Now.Ticks是有暇庛的,Ticks是循序且有精密度的問題,因此這樣的亂數種子怎麼看都是不洽當的。

GUID是一個不錯的思考方向

GUID本身的演算就是朝著不重覆的方向來前進,因此在循序這個議題上就排除了。另外也沒有精密度的問題,就算是在千分之一秒內連續取兩次GUID,也不會是一樣的GUID,因此看起來非常的洽當,至於要怎麼符合Random(Int32)這個多載的建構子,這下Object Hash就當仁不讓啦!程式碼如下:

System.Random oRnd = new System.Random(System.Guid.NewGuid().GetHashCode());
System.Random System.DateTime.Now.Ticks System.Guid RandomSeed