首頁 >後端開發 >C++ >為什麼在緊密的循環中重複呼叫`random.next()`?

為什麼在緊密的循環中重複呼叫`random.next()`?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-02-03 08:26:42447瀏覽

Why Do Repeated Calls to `Random.Next()` in a Tight Loop Produce Identical Numbers?

在循環中有效地生成隨機數

以下代碼片段在循環中生成隨機數時演示了一個常見的陷阱:

<code class="language-csharp">// Inefficient random number generation
public static int RandomNumber(int min, int max)
{
    Random random = new Random();
    return random.Next(min, max);
}</code>

>在緊密的循環中反複調用此功能,例如:

>
<code class="language-csharp">byte[] mac = new byte[6];
for (int x = 0; x < 6; x++)
{
    mac[x] = (byte)RandomNumber(0, 255);
}</code>

>通常會在數組中產生相同的值。 這是因為在每次迭代中的系統時鐘都重新定位。如果循環迅速執行,則時鐘尚未發生重大變化,從而導致相同的種子,因此,“隨機”數字的序列相同。 mac>Random解決方案:一個,共享的實例

正確的方法涉及創建一個單個實例並在整個循環中重複使用。 還應考慮用於多線程應用程序的線程安全。 這是一個改進的版本:

>通過使用Random>實例,我們確保創建一個

對象。
<code class="language-csharp">// Efficient and thread-safe random number generation
private static readonly Random random = new Random();
private static readonly object syncLock = new object();

public static int RandomNumber(int min, int max)
{
    lock (syncLock)
    {
        return random.Next(min, max);
    }
}</code>
>語句可以在多線程場景中保護種族條件,確保只有一個線程一次訪問

>方法。 這保持了生成數字的完整性和隨機性。

以上是為什麼在緊密的循環中重複呼叫`random.next()`?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn