1

私はこのようなメソッドを定義しました:

private String getRadndomNumber(int min, int max) {
    Random rnd = new Random((int) DateTime.Now.Ticks & 0x0000FFFF);
    return Convert.ToString(rnd.Next(min,max));
}

私はシードと最小、最大間隔の両方を定義しています.SEED値がここで役立つかどうか知りたいですか?

tnx :)

4

2 に答える 2

2

シード値が役立つかどうかは、何をしようとしているのかによって異なります!

をシードとして使用DateTime.Now.Ticks & 0xFFFFしています。つまり、(i)現在の時刻に基づいてシードを作成し、(ii)そのシードを 0 ~ 65535 の値に制限しています。一般に、これらはどちらも特に良いアイデア。システム クロックの粒度は約 15 ミリ秒 (iirc) であるため、同じ 15 ミリ秒の「セグメント」内でメソッドを呼び出すと、同じシードが使用されます。

Random明示的なシードをコンストラクターに渡さない場合はEnvironment.TickCount & 0x7FFFFFFF、シードとして効果的に使用されます。そのため、現在の時刻に基づいたままになりますが、カスタム シードよりもはるかに広い範囲 (0 ~ 2147483647) になります。

コンストラクタードキュメントRandom(Int32)から...

異なるオブジェクトに同一のシード値を提供すると、Random各インスタンスは同一の乱数シーケンスを生成します。

コンストラクタードキュメントRandom()から...

デフォルトのシード値はシステム クロックから派生し、有限の分解能を持ちます。その結果、Random既定のコンストラクターの呼び出しによって連続して作成されるさまざまなオブジェクトは、同じ既定のシード値を持つため、同じ乱数のセットが生成されます。この問題は、単一のRandomオブジェクトを使用してすべての乱数を生成することで回避できます。

于 2012-05-30T10:16:47.697 に答える
1

Seed は乱数を生成するのに役立ちます。これは、ランダム アルゴリズムに使用される基数です。毎回同じシードを使用すると、予測可能な「乱数」のセットが順番に出てくる可能性があります。

MS のドキュメントから:

「アプリケーションで異なる乱数シーケンスが必要な場合は、このコンストラクターを異なるシード値で繰り返し呼び出します。一意のシード値を生成する 1 つの方法は、時間依存にすることです。たとえば、システム クロックからシード値を導出します。ただし、システム クロックには、このコンストラクターの異なる呼び出しを異なるシード値で提供するのに十分な解像度がない可能性があります。」

デフォルトのコンストラクターはシステム クロックをシードとして使用しますが、同じティックで複数のインスタンスが作成されると、ジェネレーター間で予測可能な数値が発生する可能性があります。

于 2012-05-30T10:07:40.913 に答える