JavaのRandom generatorを使ってnextIntで数値を生成すると、数値は一様に分布します。しかし、2つのランダムインスタンスを使用して、両方のランダムクラスで数値を生成するとどうなりますか?数字は一様に分布するかどうか?ランダムな分布を持つ一様分布
答えて
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つは、他のすべてのジェネレータの種を生成するために乱数ジェネレータを使用することです。
あなたが同じ値を持つ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のサイド・バイ・サイドを実行しているから、分布の散布図である:
そしてここでは、単一RNGを実行しているの分布であります合計2000個の数字を生成:
をこの有限集合以上の高品質な離散均一な分布を生じているアプローチはかなり明確なようです。
高品質のランダム性を探している場合、同じシードの2つのRNGをシードすることは悪い考えです。しかし、このケースでは、我々はにがあり、それぞれのRNGが独立してかなり高い品質のランダム性を出しているシナリオを作成しましたが、出力が組み合わされたときに品質が著しく低くなりました(離散的ではありません)。
あなたは質問で質問に答えます。 –
あなたは正しいですが、この場合であっても、得られる分布**は**均一です。 – Grodriguez
@ Grodriguezプロットは誤解を招く可能性があります - 最初の散布図では、各点は実際には正確に2点が重なっています。視覚的には、チャート1は、チャート2より少数のサンプルで均一に見える。しかし、実際には両方のチャートのサンプル数が同じである。少なくとも、それは私がそれをどう考えているかです。私はChi Squared Testが出力について何と言うのだろうかと思います。 –
- 1. ランダムな二重分布とガウス分布
- 2. 各パスでランダムな一様なint分布を減らす
- 3. Javaランダム分布
- 4. R「ランダム」分布
- 5. ランダム確率分布確率分布から一定数
- 6. 並列ランダム分布
- 7. 一様分布のランダム可変長コード番号
- 8. 2Dで一様に分布する点
- 9. ランダムなべき乗則分布ウェイトを持つネットワーク
- 10. Julia:ランダム正規分布
- 11. 丸い矩形内に一様分布のランダムな位置を生成する
- 12. 指数分布/ポアソン分布
- 13. 2Dのランダムな点の均等分布
- 14. ランダムなインデックス分布の奇妙さ
- 15. 正方形のランダムな一点分布(キャッチ付き)
- 16. 分布
- 17. ランダムな分布でピリオドを見つける
- 18. Bashで均等に分布するランダム
- 19. 分散分布アルゴリズム
- 20. ブートストラップで一様に分布した行(20)を作成する
- 21. PyTorchの範囲[r1、r2]で一様分布を得るには?
- 22. 一様分布のランダムビットセットを生成する方法
- 23. 与えられた分散と平均のmatlabの一様分布を持つ数列
- 24. {-1,1}に変換された一様分布[0,1]
- 25. 一様分布の乱数セットの作成
- 26. ディスクリート均一な円形の分布
- 27. 円上のオブジェクトの均一な分布
- 28. 不均一なデータから一様分布を作成するサンプル
- 29. 共分散行列を持つ正規分布ランダムベクトルの生成
- 30. データ分布スパーク
' 「揮発性」は原子的であるとは認めていない。 –
@ J-16:私はそれがJava 1.5で導入された新しいJavaメモリモデルで保証されると信じています(http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#volatile )。とにかくこれは私のコードではありません。 'java.util.Random'の内部実装です。 – Grodriguez
JMMの下では、 'long'は' volatile'とマークするかどうかにかかわらず常に原子的です(半分の値は決して表示されません)。長い。したがって、複数のスレッドが変数をすべて「0」(たとえば)として読み込み、すべて値を「1」に増やし、すべて「1」を変数に書き戻すことが可能です。カウンタを100%確実にアクセスごとに1回インクリメントするには、同期が必要です。 'AtomicLong'のような' java.util.concurrent.atomic'のクラスはこれを簡単かつ正確にします。 –