本文实例为大家分享了java随机数生成代码、供大家参考、具体内容如下
パッケージcom.gonvan.common.utils; Java.util。*をインポートします。 /** *随机数工具 * * @author yuerzm * * /public final class lotteryaliasmethod { /** *分布からのサンプルに使用される乱数ジェネレーター。 */プライベートファイナルランダム。 /***エイリアステーブル。 */ private final int []エイリアス; /***確率テーブル。 */プライベートファイナルダブル[]確率; /** *離散分布からサンプリングするための新しいaliAsmethodを構築し、確率分布に基づいて *ハンドバックアウトカムをサンプリングします。 * <p/> *入力として指定された結果0、1、 * ...、n -1に対応する確率のリストを、このコンストラクターは、この分布から効率的にサンプリングするために必要な確率とエイリアステーブルを作成します。 * * @param確率 *確率のリスト。 */ public lotteryaliasmethod(list <double>確率){this(enbabilities、new Random()); } /** *新しいAliAsmethodを構築して、個別の分布からサンプリングし、確率分布に基づいて *ハンドバックの結果をサンプリングします。 * <p/> *入力として指定された結果0、1、 * ...、n -1に対応する確率のリストと、基礎となるジェネレーターとして使用する乱数ジェネレーターとともに、このコンストラクターは、この分布から効率的にサンプリングするために必要な確率と *エイリアステーブルを作成します。 * * @param確率 *確率のリスト。 * @paramランダム *ランダム数ジェネレーター * / public lotteryaliasmethod(list <double>確率、ランダムランダム){ / *入力で基本的な構造チェックを実行することから始めます。 */ if(probability == null || random == null)新しいnullpointerexception(); if(probability.size()== 0)新しいIllegalargumentException( "確率ベクトルは非空白でなければならない。"); /*確率とエイリアステーブルのスペースを割り当てます。 */ probability = new double [probabilities.size()]; alias = new int [probabilities.size()]; /*基礎となるジェネレーターを保存します。 */ this.random = random; /*平均確率を計算し、後で使用するためにキャッシュします。 * /最終倍平均= 1.0 / probability.size(); / * *確率リストのコピーを作成します。 */確率= new ArrayList <Double>(確率); /*テーブルを入力する際にワークリストとして機能する2つのスタックを作成します。 */ deque <integer> small = new arraydeque <integer>(); deque <integer> large = new arraydeque <integer>(); /*入力確率をスタックに入力します。 * / for(int i = 0; i <probabilities.size(); ++ i){ / * *確率が平均確率を下回っている場合、小さなリストに *追加します。それ以外の場合は、大きなリストに追加します。 */ if(probabilities.get(i)> =平均)large.add(i);それ以外の場合はsmall.add(i); } / * *注:アルゴリズムの数学的仕様では、大きなリストの前に小さなリストを常に排出します。ただし、 *浮遊点の不正確さのため、これは必ずしも真実ではありません。 *その結果、この内側のループ(大小の要素をペアにしようとする)は、両方のリストが空でないことを確認する必要があります。 * / while(!small.isempty()&&!large.isempty()){ /* small and大規模な確率のインデックスを取得します。 */ int less = small.removelast(); int more = large.removelast(); / * *これらの確率は、 * 1/nに重量1.0が与えられるように、まだスケーリングされていません。代わりにここでこれを行います。 */確率[Less] = probabilities.get(less) * perpabilities.size();エイリアス[少ない] = more; / * *より大きな量の確率を適切な量だけ減らします *。 */ probabilities.set(more、(probabilities.get(more) + pervabilities.get(less)) - 平均); / * *新しい確率が平均よりも少ない場合は、 *小さなリストに追加します。それ以外の場合は、大きなリストに追加します。 * / if(probabilities.get(more)> = 1.0 / probabilities.size())large.add(more);それ以外の場合はSmall.Add(詳細); } / * *この時点で、すべてが1つのリストにあります。つまり、残りの確率はすべて1 /nでなければなりません。これに基づいて、それらを適切に設定します。数値の問題により、どの *スタックがエントリを保持するかを確認できないので、両方を空にします。 */ while(!small.isempty())確率[small.removelast()] = 1.0; while(!large.isempty())確率[large.removelast()] = 1.0; } /***基礎となる分布から値をサンプリングします。 * * @return基礎となる分布からサンプリングされたランダム値。 * / public int next(){ /*フェアダイロールを生成して、検査する列を決定します。 */ int column = random.nextint(probability.length); /*バイアスコイントスを生成して、選択するオプションを決定します。 */ boolean cointoss = random.nextdouble()<確率[column]; /*結果に基づいて、列またはそのエイリアスのいずれかを返します。 */ COINTOSSを返しますか?列:エイリアス[列]; }}以上就是本文的全部内容、希望对大家的学习有所帮助。