2と互いに素で均等に分配される乱数
-
21-08-2019 - |
質問
具体例
私は0と2、までの間の乱数を生成する必要があります。 (-1、0、および1の間でランダムに選択します)。
単純なアプローチはrand() mod 3
は整数を返すrand()
ような何かをすることです。 rand()
の上限は互いに素ではない(と下限が0である)限り、このアプローチは、統計的に乱数を生成しません。
例えば、)(RANDを想定弾性率マップする、(包括的、0〜3)2ビットを返さ
0 - > 0
1 - > 1
2 - > 2
3 - > 0
0に向かってこのスキューは、明らかに、より多くのビットが返されることになるが、それにもかかわらず、スキューが残る場合にはるかに少ないであろう。
一般的な質問
、nは2と互いに素であり、0とN-1、包括的に均等に分布した乱数を生成する方法はありますか?
解決
一般的なアプローチは、最後のフルサイクル以上のランダムな値を破棄し、ちょうど新しい乱数をお願いすることです。
他のヒント
これは、上のk * n個のkは整数であることをバインドあなたのrand()を選択するに役立つかもしれません。結果が均等に分散され、この方法は、ランド()は、良好なランダム発生器であることを条件とする。
上限を削減することはできません場合は、は、あなたがそのk個の* nは、ランド()上位できるだけバインドに近くなるように、Kを選択し、再試行この数以上の結果を破棄することができます。
基本的には、あなたのRNGを使用して、N以上のすべてを破棄し、再試行してください。最適化のために、あなたはMODを使用し、n個の*の床の上にすべてを捨てることができます(MAX / N)
一般的な回答:あなたは数のわずか2ビット以上のものを使用する必要があります。
は親指の私のルールは、 X 、<= X <1.0 0.0は、3を掛けと切り捨て、浮動小数点値を生成することです。それはあなたのビットの大きな数に依存する範囲0、1の値及び2を取得する必要があります。