質問

具体例

私は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を選択し、再試行この数以上の結果を破棄することができます。

をhref="https://stackoverflow.com/questions/464476/generating-shuffled-range-using-a-prng-rather-than-shuffling/467767#467767">参照してください。同様の質問に対するます。

基本的には、あなたのRNGを使用して、N以上のすべてを破棄し、再試行してください。最適化のために、あなたはMODを使用し、n個の*の床の上にすべてを捨てることができます(MAX / N)

一般的な回答:あなたは数のわずか2ビット以上のものを使用する必要があります。

は親指の私のルールは、 X 、<= X <1.0 0.0は、3を掛けと切り捨て、浮動小数点値を生成することです。それはあなたのビットの大きな数に依存する範囲0、1の値及び2を取得する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top