System.Random の既定のコンストラクターを使用して乱数を生成するプロセスがいくつかあります。MSDN でそれについて読みましたが、使用する特定のシステム クロックの解像度については言及されていません。たとえば、System.Random はシステム クロック シードをミリ秒または秒単位で取得しますか? 複数のプロセス間でデフォルトのコンストラクターを使用して、それらの間でランダムな値を取得することは安全ですか?
乾杯
それはEnvironment.TickCount
あなたがReflectorでそれをチェックすることができる使用です。ただし、重要なのは一意のシードを取得することです。そのため、ProcessIDを使用してこの値に対して算術演算を使用できます。お気に入り:
Random(Environment.TickCount + System.Diagnostics.Process.GetCurrentProcess().Id);
等
シードは、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;
}
}
}
異なるプロセスを使用している場合は、プロセス ID を使用して、プロセスごとに Random の単一インスタンスを作成することを検討してください。
private static readonly Random _theSingleRandom =
new Random(Process.GetCurrentProcess().Id);
System.Random は TickCount をシードとして使用します。http://msdn.microsoft.com/en-us/library/windows/desktop/ms724408(v=vs.85).aspxの MSDN ドキュメントには、次のように記載されています。
分解能 [...] はシステム タイマーの分解能に制限されており、通常は 10 ミリ秒から 16 ミリ秒の範囲です。
したがって、TickCount の 2 つの異なる値の間には 10 ~ 16 ミリ秒あります。