2組の乱数(1番目と2番目のランダム{0,1,2,3,4}
)を組み合わせてn*n
の可能性を明確にする方法を見つける必要があります。基本的に問題は、追加すると、このようなものが得られることです。
X
0 1 2 3 4
0 0 1 2 3 4
Y 1 1 2 3 4 5
2 2 3 4 5 6
3 3 4 5 6 7
4 4 5 6 7 8
これは重複していますが、これはあなたが望むものではありません。 2つのセットを組み合わせる1つの方法は、です。ここで、X
とY
は2つの乱数です。それはだから今、あなたが持っているあなたの乱数の大きな集合をこの
X
0 1 2 3 4
0 0 1 2 3 4
Y 1 5 6 7 8 9
2 10 11 12 13 14
3 15 16 17 18 19
4 20 21 22 23 24
のような結果セットを与えるだろう、あなたは逆の操作を行うと、それを小さくする必要があります。このセットには25
という別個の値があります(5で始まって2つの乱数を使用したので、5*5=25
)。あなたが望むセットは8つの異なる値を持っています。これを行うにはナイーブな方法が
x = rnd(5) // {0,1,2,3,4}
y = rnd(5) // {0,1,2,3,4}
z = x+y*5 // {0-24}
random07 = x mod 8
だろうこれは確かに{0,7}
の範囲を持っているでしょう。しかし、値{1,7}
は3/25回表示され、値0
は4/25回表示されます。これは、0 mod 8 = 0
,8 mod 8 = 0
,16 mod 8 = 0
、24 mod 8 = 0
です。
これを修正するには、上記のコードをこれに変更します。
do {
x = rnd(5) // {0,1,2,3,4}
y = rnd(5) // {0,1,2,3,4}
z = x+y*5 // {0-24}
while (z != 24)
random07 = z mod 8
これはあなたの確率をオフに投げている一つの値(24
)を取り、それを破棄します。このように「悪い」値を取得した場合、新しい乱数を生成すると、アルゴリズムは非常にわずかに長く実行されます(この場合、実行するには2倍、1/625には3倍の時間がかかります)長い、など)。しかし、それはあなたに正しい確率を与えるでしょう。
ありがとうございます。私はしばらく努力してきましたが、モジュラスは考えていませんでした。 コーラン – Koran
random07 = z mod 8を意味しないのですか? – user2600959
うん。あなたが正しい。ありがとうございました! –