>循環中的隨機數產生問題
>本文解決了在循環中使用Random.Next()
時遇到的常見問題:產生相同隨機數的連續迭代。 當多個物件快速地實例化時,這個問題通常會表現出來。 Random
>
問題方案:
考慮以下程式碼段:>
<code class="language-csharp">class A { Random rnd = new Random(); public void Count() { int r1 = rnd.Next(-1, 1); int r2 = rnd.Next(-1, 1); // ... further code using r1 and r2 ... } } class B { List<A> listOfA = new List<A>(); public B() { // ... populate listOfA ... foreach (A instance in listOfA) { instance.Count(); } } }</code>
包含類別的多個實例listOfA
,則每個A
物件建立了自己的A
>實例。 由於高速實例化,這些物件可能會接收相同的種子值(通常是從系統時鐘得出),從而導致相同的隨機數序列。
Random
Random
根本原因:
> 問題源自於預設的建構子對系統時脈的依賴。 如果在非常短的時間範圍內創建了多個
對象,則它們幾乎相同的種子值,從而導致相同的pseudo-random數字生成。>Random
解:單一隨機實例Random
解決方案很簡單:建立一個單一實例,並在類別的所有實例中重複使用它。 這樣可以確保產生獨特的,非重複的隨機數序列。
>這是校正後的程式碼:Random
A
實例(
)注入<code class="language-csharp">class A { private Random rnd; public A(Random rnd) { this.rnd = rnd; } public void Count() { int r1 = rnd.Next(-1, 1); int r2 = rnd.Next(-1, 1); // ... further code using r1 and r2 ... } } class B { Random rnd = new Random(); List<A> listOfA = new List<A>(); public B() { // ... populate listOfA, passing rnd to the constructor ... foreach (A instance in listOfA) { instance.Count(); } } }</code>
的呼叫都從相同的,適當的播種序列中繪製。 這有效地消除了重複的隨機數的產生。 Random
以上是為什麼 Random.Next 在連續循環迭代中產生相同的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!