2014-02-06 64 views
1

在.NET中使用System.Random並提供種子時,是否應該避免使用某些種子?我在問,因爲我喜歡在運行類似仿真的計算時注入已知的種子,以便以後可以根據需要複製結果。然而,隨機數生成器的函數是週期性的,週期取決於種子,所以我想知道是否有特定的System.Random實現的警告,並且作爲獎勵,如果有人知道它使用了什麼函數在蓋子後面。使用隨機時應該避免種子嗎?

注意:我知道System.Random不是高質量的RNG,我應該使用其他方法進行嚴重仿真。這個問題嚴格地關於System.Random及其實現。

回答

3

我懷疑是否有任何種子比其他種子更短的時間的一般規則。較大的數字不能保證較長的時間,像0這樣的數字不一定會有短的時間。

MSDN Documentation

當前實現Random類是基於唐納德·E·Knuth的消減隨機數生成算法。欲瞭解更多信息,請參閱D. E. Knuth。 「計算機編程的藝術,第2卷:研究數學算法」。 Addison-Wesley,Reading,MA,第二版,1981年。

還有一個Microsoft Connect thread關於執行該算法的錯誤。顯然在.NET代碼中有一個錯字。 .NET軟件工程師之一評論道:

確實,隨機實現中存在一個真正的問題。

我們已經在團隊內部和我們的一些合作伙伴進行了討論,並得出結論,我們很遺憾現在無法解決問題。原因是一些應用程序依賴於這樣的事實,即當用相同的種子初始化時,生成器產生相同的僞隨機序列。即使變化更好,一旦遷移到「固定」版本,它將打破假設的應用程序。

1

點的夫婦 -

  1. 我不認爲衆所周知的PRNG的週期取決於種子。我相信這個問題會執行會導致看似非隨機值的長序列

  2. 然而可憐的直播過程中得到解決,請參閱Disadvantages of Mersenne Twister

  3. 上述點很重要,因爲.NET實現可改變未來

+0

有趣的點#2 – x0n