|
Major Member
|
num = 39
For i = 0 To 5
b1 = Int(Rnd() * num) + 1 '亂數選號, 範圍為 整數[(0~1)*num]+1, 此時所計算出的亂數整數為數列的座標
Text1(i).Text = ball(b1) '選中的號碼,放入Text1文字方塊中
ball(b1) = ball(num) '拿最末尾的數取代已選出的號碼
num = num - 1 '選擇範圍減 1
Next i '因為已選過的號碼已被最末尾數取代, 故不會再出現, 又因為範圍減一, 所以最末尾數不會重複
====================================
整個運作邏輯乍看之下大致似乎沒問題, 但是 Rnd() 所得到的數必須小於 (38.5/39), 否則乘上 num 再加 1, 會超過數列末尾, 譬如:
1. 若第一次 rnd() 即得 0.9872 以上的數, 則 b1 = 0.9872*39 + 1=40
2. 若是第一次選到 39, 而第二次 rnd() 得 0.9872 以上的數, 得出 b1=39, 也就是重複選號.
3. 同理, 其它任一次只要 rnd() 得 0.9872 以上的數, 都會導致末尾數代替被選中的數, 結果會變成末尾數重複加到數列中, 也就是機率會升高, 另外因為範圍每次減一, 只要 rnd() 得 0.9872 以上的那一次, 該數列末尾的數會被跳過丟棄, 也就是失去被選擇機會, 譬如:
第一次選中位址 38, 位址 38 內的數被位址 39 內含值(39), 位址範圍減一到 38..
第二次選中位址 26, 位址 26 內的數被此時位址最末尾內含值 (39) 代替, 位址範圍減一到 37..
第三次 rnd() 得 0.9872 以上的數, 選中位址 38, 位址 38 內的數是 39, 位址 38 內的數被此時位址 39 內含值 (39) 代替, 位址範圍減一只到 36, 位址 37 內含值 (37) 將永不被選到, 機率為零..
第四次選中 26, 位址 26 內的數為 39, 因為數字 39 已被選過, 變成重複選號, 位址 26 內的數被此時位址最末尾內含值 (36) 代替, 位址範圍減一只到 35..
所以整個關鍵在於 rnd() 不能超過 38.5/39.....
|