首頁 > 後端開發 > C++ > 為什麼 Random.Next 在連續循環迭代中產生相同的值?

為什麼 Random.Next 在連續循環迭代中產生相同的值?

Mary-Kate Olsen
發布: 2025-01-24 23:36:12
原創
569 人瀏覽過

Why Does Random.Next Produce Identical Values in Consecutive Loop Iterations?

>循環中的隨機數產生問題

>本文解決了在循環中使用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>實例。 由於高速實例化,這些物件可能會接收相同的種子值(通常是從系統時鐘得出),從而導致相同的隨機數序列。 RandomRandom根本原因:

> 問題源自於預設的建構子對系統時脈的依賴。 如果在非常短的時間範圍內創建了多個

對象,則它們幾乎相同的種子值,從而導致相同的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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板