4

System.Random の既定のコンストラクターを使用して乱数を生成するプロセスがいくつかあります。MSDN でそれについて読みましたが、使用する特定のシステム クロックの解像度については言及されていません。たとえば、System.Random はシステム クロック シードをミリ秒または秒単位で取得しますか? 複数のプロセス間でデフォルトのコンストラクターを使用して、それらの間でランダムな値を取得することは安全ですか?

乾杯

4

4 に答える 4

3

それはEnvironment.TickCountあなたがReflectorでそれをチェックすることができる使用です。ただし、重要なのは一意のシードを取得することです。そのため、ProcessIDを使用してこの値に対して算術演算を使用できます。お気に入り:

Random(Environment.TickCount + System.Diagnostics.Process.GetCurrentProcess().Id);

于 2012-11-06T14:16:52.863 に答える
3

シードは、10 ミリ秒から 16 ミリ秒の範囲のミリ秒単位です。ただし、覚えておくべき最も重要なことは、 異なる「ランダム」値を生成できるRandom場合は、常に同じインスタンスを使用する必要があるということです。タイトなループで常に新しいインスタンスを作成すると、同じ値が何度も得られます。

したがって、とにかく同じインスタンスを使用する場合は、デフォルトのコンストラクターを使用するのが「安全」です。別のスレッドでそれらが必要なためではない場合は、Jon Skeet のこのヘルパー クラスを使用できます (こちらから)。

public static class RandomHelper
{
    private static int seedCounter = new Random().Next();

    [ThreadStatic]
    private static Random rng;

    public static Random Instance
    {
        get
        {
            if (rng == null)
            {
                int seed = Interlocked.Increment(ref seedCounter);
                rng = new Random(seed);
            }
            return rng;
        }
    }
}
于 2012-11-06T14:01:41.097 に答える
2

異なるプロセスを使用している場合は、プロセス ID を使用して、プロセスごとに Random の単一インスタンスを作成することを検討してください。

private static readonly Random _theSingleRandom = 
                          new Random(Process.GetCurrentProcess().Id);
于 2012-11-06T14:07:21.097 に答える
0

System.Random は TickCount をシードとして使用します。http://msdn.microsoft.com/en-us/library/windows/desktop/ms724408(v=vs.85).aspxの MSDN ドキュメントには、次のように記載されています。

分解能 [...] はシステム タイマーの分解能に制限されており、通常は 10 ミリ秒から 16 ミリ秒の範囲です。

したがって、TickCount の 2 つの異なる値の間には 10 ~ 16 ミリ秒あります。

于 2012-11-06T13:59:57.940 に答える