你必須找到一種方法來結合兩組隨機數(第一個和第二個隨機{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
其中有重複,這不是你想要的。一種可能的方法來組合使用兩套將是Z = X + Y*5
其中X
和Y
是兩個隨機數。這將使你喜歡這個
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,並用兩個隨機數,所以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
),它擺脫你的概率和丟棄。生成一個新的隨機數,如果你得到這樣一個'不好的'值將會使你的算法運行的時間稍長一點(在這種情況下,1/25的時間需要運行2x的時間,1/625需要3x的時間長等)。但它會給你正確的概率。
非常感謝。我一直在嘗試一段時間,但從未想過模數。 古蘭經 – Koran 2009-08-12 19:23:45
難道你不是指random07 = z mod 8嗎? – user2600959 2014-12-10 19:42:31
是的。你是對的。謝謝! – 2014-12-12 23:14:04