2010-11-23 17 views
13

JavaのRandom generatorを使ってnextIntで数値を生成すると、数値は一様に分布します。しかし、2つのランダムインスタンスを使用して、両方のランダムクラスで数値を生成するとどうなりますか?数字は一様に分布するかどうか?ランダムな分布を持つ一様分布

答えて

7

Randomインスタンスごとに生成された数字は均等に分散されるため、両方ともRandomインスタンスで生成された乱数のシーケンスを結合すると、均等に分散する必要があります。

結果の分布が均一であっても、シードに注意して2つのジェネレータの出力間の相関を避けることができます。デフォルトの引数なしコンストラクタを使用する場合、シードはすでに異なるはずです。 java.util.Randomのソースコードから:あなたは(Random(long seed)コンストラクタを使用して、またはsetSeed(long seed)を呼び出すことによって)明示的にシードを設定している

private static volatile long seedUniquifier = 8682522807148012L; 

public Random() { this(++seedUniquifier + System.nanoTime()); } 

場合は、こののことは自分を世話をする必要があります。可能なアプローチの1つは、他のすべてのジェネレータの種を生成するために乱数ジェネレータを使用することです。

+0

' 「揮発性」は原子的であるとは認めていない。 –

+0

@ J-16:私はそれがJava 1.5で導入された新しいJavaメモリモデルで保証されると信じています(http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#volatile )。とにかくこれは私のコードではありません。 'java.util.Random'の内部実装です。 – Grodriguez

+0

JMMの下では、 'long'は' volatile'とマークするかどうかにかかわらず常に原子的です(半分の値は決して表示されません)。長い。したがって、複数のスレッドが変数をすべて「0」(たとえば)として読み込み、すべて値を「1」に増やし、すべて「1」を変数に書き戻すことが可能です。カウンタを100%確実にアクセスごとに1回インクリメントするには、同期が必要です。 'AtomicLong'のような' java.util.concurrent.atomic'のクラスはこれを簡単かつ正確にします。 –

8

あなたが同じ値を持つRandomインスタンスを両方ともシードすると、間違いなく品質の均一な一様分布が得られます。

public class RngTest2 { 
    public static void main(String[] args) throws Exception { 
     long currentTime = System.currentTimeMillis(); 
     Random r1 = new Random(currentTime); 
     Random r2 = new Random(currentTime); 
     System.out.println(r1.nextInt()); 
     System.out.println(r2.nextInt()); 
    }   
} 

をしかし、それはただ1回の繰り返しです:文字通り二回正確に同じ番号を印刷し、最も基本的なケースを考えてみよう(...はるかに少ないランダムより取得していません)。サンプルサイズのクランキングを開始するとどうなりますか?ここで

は、合計2000人の番号を生成するために、2つの同じ播種のRNGのサイド・バイ・サイドを実行しているから、分布の散布図である:

alt text

そしてここでは、単一RNGを実行しているの分布であります合計2000個の数字を生成:

alt text

をこの有限集合以上の高品質な離散均一な分布を生じているアプローチはかなり明確なようです。

高品質のランダム性を探している場合、同じシードの2つのRNGをシードすることは悪い考えです。しかし、このケースでは、我々はがあり、それぞれのRNGが独立してかなり高い品質のランダム性を出しているシナリオを作成しましたが、出力が組み合わされたときに品質が著しく低くなりました(離散的ではありません)。

+1

あなたは質問で質問に答えます。 –

+0

あなたは正しいですが、この場合であっても、得られる分布**は**均一です。 – Grodriguez

+0

@ Grodriguezプロットは誤解を招く可能性があります - 最初の散布図では、各点は実際には正確に2点が重なっています。視覚的には、チャート1は、チャート2より少数のサンプルで均一に見える。しかし、実際には両方のチャートのサンプル数が同じである。少なくとも、それは私がそれをどう考えているかです。私はChi Squared Testが出力について何と言うのだろうかと思います。 –

関連する問題