0

基本的に、0 から 2^16-1 までの数値を返すことができるランダム関数を使用する必要があります。

私はこれを利用して、たとえば、1 と 6 の間の 6 つの間隔を生成しようとしています (ダイス ポーカーを考えています)。基本的に、私のためにランダムに生成されたその1つの番号を使用し(範囲のみを指定できます)、できれば1回だけ呼び出す必要があります。次に、その数字を取り、値が 1 ~ 6 になるように 6 つのサイコロに「分割」します。

頭に浮かぶのはビットマスキングですが、これが正しいコンテキストであるかどうかはわかりません。

バイナリの観点からすると、サイコロの値を 0 ~ 5 にするのが合理的です。これにより、2 進数の 000-101 が得られます。ここで、ランダム関数の戻り値の最大値は 101101101101101101 (6 つのサイコロ、それぞれが「6」) になり、10 進数では、ランダムな int 戻り値の上限が 187245 になることを意味します。下限は 0 になります。 random 関数は数値 66508 を返し、バイナリ形式にすると 010|000|001|111|001|100 になりますが、これでは十分ではありません! この場合、サイコロの 1 つが 111 = 7 になり、間隔が 0-5 (1-6) であるはずのときにそれを取得できません:(

制限範囲内の 10 進数に 1 ~ 6 (0 ~ 5) の値を持つ 6 つのサイコロを含める方法を理解する必要がありますが、助けが必要です。

4

1 に答える 1

2

x % 6(x / 6) % 6(x / 6^2) % 6、...を使用できます。(x / 6^5) % 6ここで、x は乱数ジェネレーターからの数値です。ただし、これを行うとバイアスがかかります。このバイアスを回避したい場合は、x を拒否し、x が 6**6-1 より大きい場合は再選択する必要があります。

于 2009-12-13T17:24:55.030 に答える