理解 C# 中的隨機數產生並避免序列重複
本文解決了 C# 中的一個常見問題:Random
類別的多個實例產生相同的隨機數序列。 Random
類別雖然設計用於產生看似不可預測的數字,但其內部演算法依賴種子值。 如果快速連續建立多個 Random
對象,它們通常會收到相似的種子值(通常基於系統時鐘),從而產生相同的輸出序列。
問題:多 Random
實例
為每個需要隨機數的物件建立一個新的 Random
實例是根本原因。 由於種子值非常接近,因此產生的序列幾乎相同。
解:單一共用Random
實例
解決方案很簡單:建立一個 Random
實例並在所有需要隨機數的物件之間共用它。 這確保每個物件都從相同的、不斷演變的序列中繪製,從而防止重複問題。
以下是使用靜態成員實現此功能的方法:
<code class="language-csharp">class A { private static readonly Random rnd = new Random(); // Static, read-only instance public void Count() { int r1 = rnd.Next(-1, 1); int r2 = rnd.Next(-1, 1); } } class B { List<A> listOfA = new List<A>(); public void DoSomething() { foreach (A aClass in listOfA) { aClass.Count(); } } }</code>
透過使用 static readonly
字段,我們確保單一 Random
實例建立一次並在類別 A
的所有實例之間共用。這消除了重複種子值的風險,並保證每次呼叫rnd.Next()
都有唯一的隨機數序列。 這種方法為每個 A
物件產生真正隨機且不同的序列。
以上是為什麼我的C#隨機數生成器會在多個對像上產生相同的序列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!