PRNGの値をより小さな範囲に制限する最良の方法は何ですか?モジュラスを使用し、古い最大値が新しい最大数で均等に割り切れない場合は、0
から(old_max - new_max - 1)
に偏ってください。私は最善の方法は、このようなもの(これは浮動小数点、整数でない数学です)pseduo乱数をより小さな範囲に制限する適切な方法は何ですか?
random_num = PRNG()/max_orginal_range * max_smaller_range
だろうと仮定しますが、私の腸の中で何かが私はその方法問うます(多分浮動小数点の実装と表現の違いを?)。
乱数生成器は、ハードウェアとソフトウェアのプラットフォーム間で一貫した結果を生成し、制約も同様に必要です。
私は上記の擬似コードを疑うことは正しかったです(私が考えていた理由ではありません)。 MichaelGGのanswerは私と別の方法で問題を考えました。私は小さな数字を使ってそれをモデル化し、すべての結果をテストすることができます。したがって、0から31の間の乱数を生成するPRNGがあるとし、小さい範囲を0から9にしたいとしましょう。モジュラスを使用する場合、0,1,2,3の方向にバイアスします。擬似コードを使用する場合あなたは0,2,5,7に偏っています。私は、あるセットを他のセットにマッピングする良い方法があるとは思いません。私がこれまでに考え出したベストは、old_max/new_max
より大きい乱数を再生成することですが、それには深刻な問題もあります(期間を短縮したり、正しい数値になるまで新しい数値を生成する時間など) 。
私はこの問題に素朴に接しているかもしれないと思います。文学について深刻な研究を始める時が来るかもしれません(誰かがこれに前に取り組んでいなければなりません)。
また、バイアスを導入せずに結果を制約するかなり巧妙な方法を使用するjava.util.Random.nextInt(int)を見てみることもできます。なぜそれが動作するのか理解するために1日ぐらいかかりました:) – Joey
そのソースは入手できます(申し訳ありませんが、私はJavaコーダーではありません、APIの場所については何も知らない) – DevinB
ランダムチェックは良いアイデアですが、管理可能なものに数値を減らすと、すべての結果(上記参照)をテストでき、擬似コードは実際に偏っています。今、私は理解できそうもない記事を掘り起こす必要があります。 –