2 組の乱数 (最初の乱数と 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 つの可能な方法は、Z = X + Y*5
whereX
とY
are の 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
これは、確率を下げている 1 つの値 ( 24
) を取り、それを破棄します。このような「悪い」値を取得した場合に新しい乱数を生成すると、アルゴリズムの実行時間がわずかに長くなります (この場合、1/25 の時間で実行に 2 倍の時間がかかり、1/625 の場合は 3 倍の時間がかかります)。ロングなど)。しかし、それはあなたに正しい確率を与えます。