ホームページ >バックエンド開発 >C++ >`random.next()`に繰り返し呼び出しが同一の数字を生成するのですか?

`random.next()`に繰り返し呼び出しが同一の数字を生成するのですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-02-03 08:26:42445ブラウズ

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>
配列内で同一の値をもたらします。 これは、各反復でシステムクロックで

が再目立っているためです。ループが迅速に実行された場合、クロックは大幅に変更されておらず、同じシードが発生し、したがって「ランダム」数値のシーケンスが発生します。 macRandom解決策:単一の共有インスタンス

正しいアプローチでは、単一のインスタンスを作成し、ループ全体で再利用することが含まれます。 マルチスレッドアプリケーションでは、スレッドの安全性も考慮する必要があります。 改良されたバージョンは次のとおりです

Randomインスタンスを使用することにより、1つの

オブジェクトのみが作成されていることを確認します。
<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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。