2016-12-11 4 views
1

ランダムfloatdoubleの番号を生成するために、次のコードを書いています。乱数を生成する静的メソッドを使用することをお勧めしますか?

public static class Statics 
{ 
    private static readonly Random random = new Random(); 
    private static readonly object syncLock = new object(); 

    public static double getRandomDouble(double min, double max) 
    { 
     lock (syncLock) 
     { 
      return random.NextDouble() * (max - min) + min; 
     } 
    } 

    public static float getRandomFloat(float min, float max) 
    { 
     lock (syncLock) 
     { 
      return (float)random.NextDouble() * (max - min) + min; 
     } 
    } 
} 

それは私がstaticclassと乱数を生成するための方法を使用していることをOKですか?

私のプログラムは、これらのメソッドに大きく依存しているので、生成された数値が本当にランダムであることを確認したいと思います。これらのジェネレータは多くのオブジェクトによって使用されていますが、同時には使用されていません。

+0

はい、なぜか?クラスごとに1つのランダムジェネレータが必要な場合は、これを行うことができます。 – DogeAmazed

+0

私にはうってつけです。私は問題を見ません。 – Codor

+0

ロックを使用しているので、スレッドを使用していると仮定します。乱数が多い場合、ボトルネックが発生する可能性があります。 – user1781290

答えて

5

Randomはスレッドセーフではないことがあり、静的コンテキストでRandomを使用することが問題になる理由は、ありませんしかし、心に留めておく(そして、それはあなたがやったようです)。

lockを使用してThreadを同期することを選択しました。

ただし、ThreadStaticまたはThreadLocalを使用してランダムジェネレータを作成する(better for that causeでどのようにあなたが別の種でなまけインスタンスを初期化することができます)、その方法は、あなたがロックする必要されていないのパフォーマンスを獲得することができます。彼らはあなたがthis答えに見ることができると同時に初期化される可能性があるため

または、各Threadに異なる種でRandomを初期化することを確認してください。

public static class StaticRandom 
{ 
    static int seed = Environment.TickCount; 

    static readonly ThreadLocal<Random> random = 
     new ThreadLocal<Random>(() => new Random(Interlocked.Increment(ref seed))); 

    public static int Rand() 
    { 
     return random.Value.Next(); 
    } 
} 
関連する問題