2017-05-30 4 views
1

まず、私は数学で最大ではないので、それに関係する何の無知を許してください。私は、複数回の実行の確率に基づいてランダム性を維持しようとしていますが、失敗しています。私は、この入力を持つJSONObjectJavaの複数回の実行で確率をどのように維持することができますか

{ 
    "option1": 25, 
    "option2":25, 
    "option3" :10, 
    "option4" :40 
} 

これは、割り当てられた確率に基づいて上記JSONObjectから値を選択して、私の関数である。

public static String selectRandomoptions(JSONObject options) { 
    String selectedOption = null; 

    if (options != null) { 

     int maxChance = 0; 
     for (String option : options.keySet()) { 
      maxChance += options.getInt(option); 
     } 

     if (maxChance < 100) { 
      maxChance = 100; 
     } 

     Random r = new Random(); 
     Integer randomValue = r.nextInt(maxChance); 

     int chance = 0; 
     for (String option : options.keySet()) { 
      chance += options.getInt(option); 
      if (chance >= randomValue) { 
       selectedOption = options.toLowerCase(); 
       break; 
      } 
     } 
    } 
} 

機能は、私が呼び出した場合、合理的な誤差の範囲内に振る舞いますそれは1回の実行(テストされた100回以上の呼び出し)の回数ですが、問題は私たちが分析プロセス/データを検証するためにイベントドリブンアプリケーションでサンプルデータを生成するために毎回これを実行していますが、少なくとも妥当なマージンの範囲内である程度予測可能であるか?

私はこれにどのようにアプローチするか考えている人はいますか?私はむしろ何かを維持する必要はありませんが、それが理にかなっていたり、複雑さや時間を減らしているなら、私はそれに反対しません。

+0

予測性の点でどのようなことをお探しですか?あなたはいつも同じシーケンスか、同じ確率で同じことを望んでいますか? –

+0

@Salixalba基本的にこの関数は、生成された一意のユーザーが私たちのシステムに送信するリクエストボディを生成し、複数の週にわたって24&200日(異なる時間単位のブロックに分割)の間の任意の場所にすることができます。一週間後または毎日後には、割り当てられた確率と密接に一致する生成された要求の数の結果が表示されることが予想されますが、非常に大きな変化があるようです。 – jonnie

答えて

3

Random.nextInt()によって返される値は一様に分布しているため、問題ではありません。

私はランダムな結果を繰り返し可能にしたいと考えていますが、Random with seedを使用するとよいでしょう。

2

新しい乱数を追加するたびに新しいRandom()オブジェクトを作成するのではなく、実行ごとに1回だけRandomオブジェクトを作成し、実行ごとにRandom.nextInt()オブジェクトを使用してください。 Random()コンストラクタのドキュメントを見てみると

このコンストラクタは、この constructor.itの他の呼び出しだけで、それを保証は異なる可能性が非常に高い 値に乱数ジェネレータのシードを設定し、異なっている

nextInt()よりも弱い契約のビットです。

それぞれの実行で同じ番号のシーケンスを取得する場合は、ランダムオブジェクトのRandom(long seed)またはsetSeed(long seed)メソッドを使用します。これらのメソッドは両方ともジェネレータの種を設定します。呼び出しごとに同じシードを使用した場合は、ジェネレータから同じ番号のシーケンスを取得することが保証されています。 Random.setSeed(long)

+0

メソッド呼び出し内に新しいランダムを作成しないでください。それはクラスメンバーでなければなりません。 – duffymo

+0

@duffymo私の理解が不足していると言い訳をしていますが、なぜメソッド呼び出しでそれを悪い/間違っているのか説明できますか? – jonnie

+1

乱数ジェネレータは、生成された過去の値を処理するシーケンスジェネレータです。すべての新しい値に対する新しいオブジェクトは、すでにガベージコレクションされた他のインスタンスが何を行ったのか分かりません。クヌス乱数生成アルゴリズムを見てください。 – duffymo

関連する問題