1

次のコードを実行すると、常に同じ色が選択されます。

static void Main(string[] args)
        {
            string[] Colors = new string[10] { "Red", "Yellow", "Green", "Blue", "Purple", "White", "violet", "orange", "indigo", "blue" };
            for (int i = 0; i < 13; i++)
            {
                Random rnd = new Random();
                int code = rnd.Next(0, 9);
                string Color = Colors[code];
                Console.WriteLine(Color);
            }
            Console.ReadLine();
        }

しかし、 `Random rnd = new Random();'の場合 ループの外側で作成された場合、結果は一意になります。ループがより高速で実行される場合、出力は同じになります。forループでデータベース挿入操作を実行すると、結果は異なるもの(ランダムなもの)になります(ブレークポイントを使用して段階的に実行すると、ランダムに選択されます)。

このような短い期間で異なるシードを供給することは本当に不可能ですか?

4

5 に答える 5

5

ランダムは、現在の時刻をシードとして使用します。ループで作成すると、非常に高速に発生するため、作成するたびに時間が同じになります。したがって、シードは同じであり、ランダムによって生成される値も同じになります。

于 2013-03-25T09:51:18.650 に答える
2

ランダムオブジェクトを静的メンバーにしてみてください。

private static Random rnd = new Random();

これにより、同じシード(現在の時刻)で複数の乱数オブジェクトを作成することを防ぎ、同じ数列を生成することを防ぎます。

ループはRandom、反復ごとに同じシード(現在の時刻)での新しいインスタンスを初期化します。各インスタンスには、さまざまな乱数のシーケンスが含まれています。コードはシーケンスの最初の番号を使用し、反復が終了すると、ランダムオブジェクトが破棄され、新しいRandomオブジェクトがインスタンス化されます。コードは非常に高速に実行されているため、次のランダムオブジェクトは前のオブジェクトと同時に作成されます。したがって、そのオブジェクトと同じシードがあります。新しいオブジェクトにはさまざまな番号のシーケンスが含まれていますが、シーケンスは前のオブジェクトと同じです(つまり、最初の番号、2番目の番号などが同じです)。この場合も、コードはまったく同じシーケンスの最初の番号を使用するため、番号が繰り返されます。

オブジェクトをRandom静的メンバーにすると、乱数シーケンスが1回作成され、コードはそのシーケンスの次の番号(必ずしも最初の番号とは限りません)を使用するため、さまざまな乱数のシーケンスを繰り返します。

ランダムオブジェクトを静的メンバーにしたくない場合は、そのコンストラクターに一意のシードをフィードしてみてください。この目的のためにループ変数を利用できます。

于 2013-03-25T09:52:21.203 に答える
2

シードを提供しない場合は、シードにRandom使用Environment.TickCountします。このような短いループでは、ループ全体が1ティックで実行される可能性があります。したがって、シードは毎回同じであるため、「乱数」も同じです。

ループ全体に同じランダムオブジェクトを使用するだけです。

于 2013-03-25T09:53:24.137 に答える
2

コンピュータプログラミングではランダムはランダムではありません;)シードを含めるか、ランダムを含む静的オブジェクトを使用することで、ランダムを「より」ランダムにすることができます:)

于 2013-03-25T09:56:45.010 に答える
0

以下の理由により、同じランダムオブジェクトを保持する必要があります。

疑似乱数は、有限の数のセットから等しい確率で選択されます。選択された数は、明確な数学的アルゴリズムを使用して選択されるため、完全にランダムではありませんが、実用的な目的には十分にランダムです。 乱数の生成はシード値から始まります。同じシードを繰り返し使用すると、同じ一連の番号が生成されます。

http://msdn.microsoft.com/en-gb/library/system.random.aspx

于 2013-03-25T09:51:33.293 に答える