瀏覽單個文章
chenyy
New Member
 
chenyy的大頭照
 

加入日期: Jul 2002
您的住址: 地球
文章: 9
引用:
作者山賊
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 以上的數, 都會導致末尾數代替被...


Int()不是四捨五入..
不會有這個問題,因為Int是取數字整數部份,Rnd()是取[0~(不到1)]的亂數
EX:
0.9999999999 * 39 = 38.9999999961 整數部份為 38,38+1 = 39

若Rnd是理想的亂數(無限位數,演算法分佈平均)這個程式做法上我看不出有什麼問題.

以現在的寫法它的分佈理論上會比洗牌法平均很多...
舊 2008-09-22, 02:12 AM #58
回應時引用此文章
chenyy離線中