0

私はjava6random(java.util.Random、linux 64)を使用して、ページの1つのバージョンを2番目のバージョンに提供するか(通常のA / Bテスト)をランダムに決定しています。技術的には、デフォルトの空のコンストラクターでクラスを1回初期化します。そしてそれはプロパティとしてBean(Spring)に注入されます。ほとんどの場合、ページのコピーは互いに8%(+-)以内ですが、ときどき最大20%の偏差が見られます。例:

私は今、分割された2つのコピーを持っています:680/570は正常と見なされますか?Javaランダムよりも優れた/高速なバージョンを使用できますか?

ありがとう

4

3 に答える 3

3

20%の偏差はかなり大きいように見えますが、統計的に異常であるかどうかを確認するには、訓練を受けた統計家に相談する必要があります。

更新-そして答えは、それが必ずしも異常ではないということです。統計では、このような外れ値が約0.3%の確率で発生すると予測されています。


このような結果が乱数ジェネレーターによって引き起こされることは確かにもっともらしいです。このRandomクラスは単純な「線形合同」アルゴリズムを使用しており、このクラスのアルゴリズムは強力に自己相関しています。乱数の使用方法によっては、アプリケーションレベルで異常が発生する可能性があります。

これが問題の原因である場合は、暗号強度の乱数ジェネレーターに置き換えてみてください。については、javadocsを参照してくださいSecureRandomSecureRandomよりも高価ですがRandom、これによってユースケースに違いが生じる可能性はほとんどありません。


一方、これらの外れ値が実際に理論で予測された速度で発生している場合は、乱数ジェネレーターを変更しても違いはありません。

これらの外れ値が本当に厄介な場合は、別のアプローチを取る必要があります。N個のランダムな選択肢を生成する代わりに、必要な比率でfalse / trueのリストを生成してから、リストをシャッフルします。例:を使用しCollections.shuffleます。

于 2012-10-24T15:11:48.747 に答える
0

これはランダムなシーケンスを生成することを目的としているため、これはかなり正常だと思います。特定の間隔の後にパターンを繰り返したい場合seedは、コンストラクターで特定の値を使用し、特定の間隔の後に同じシードでランダムをリセットすることをお勧めします。

たとえば、100/500 / nを呼び出すたびに、メソッドRandom.next..を使用して古い値でシードをリセットします。Random.setSeed(long seed)

于 2012-10-24T15:10:20.730 に答える
0

java.util.Random.nextBoolean()は、標準偏差がsqrt(n * p *(1-p))で、p=0.5の標準二項分布のアプローチです。

したがって、900回の反復を行う場合、標準偏差はsqrt(900 * .5 * .5)= 15であるため、ほとんどの場合、分布は435〜465の範囲になります。

ただし、これは疑似ランダムであり、最初からやり直す前に通過する数のサイクルが制限されています。したがって、十分な反復がある場合、実際の偏差は理論上の偏差よりもはるかに小さくなります。Javaは、式seed =(seed * 0x5DEECE66DL + 0xBL)&((1L << 48)-1)を使用します。小さな数値で別の数式を記述して、意図的に小さな偏差を取得することもできます。これにより、乱数ジェネレーターは悪化しますが、目的により適したものになります。

たとえば、5つのtrueと5つのfalseのリストを作成し、Collections.shuffleを使用してリストをランダム化できます。次に、それらを順番に繰り返します。10回繰り返した後、リストを再シャッフルし、最初から開始します。そうすれば、5を超えて逸脱することはありません。

数学については、http://en.wikipedia.org/wiki/Linear_congruential_generatorを参照してください。

于 2012-10-24T15:56:49.680 に答える