![]() |
PCDVD數位科技討論區
(https://www.pcdvd.com.tw/index.php)
- 七嘴八舌異言堂
(https://www.pcdvd.com.tw/forumdisplay.php?f=12)
- - 能看出這個簡單程式有什麼問題的人絕對是個高手
(https://www.pcdvd.com.tw/showthread.php?t=816594)
|
|---|
b1 = Int(Rnd() * num) + 1 '亂數選號
Debug.Print b1 <==此句程式碼新增加作測式 發現Debug.Print b1 若是跑出之前的號碼 此程式會從39、38、37、36、35 這幾個號碼選出來 我懷疑 這個程式 39、38、37、36、35這幾個號碼出現機率特別高 這是我的懷疑 沒把握 |
這樣說的話, 你是懷疑 VB 的 Rnd() 的亂數表不夠亂了? (難道自己寫一個亂數產生的函式就能保證一定夠亂了嗎?)
基本上這與上頭程式的邏輯無關吧. |
這個程式看起來沒甚麼問題。
|
引用:
以"理論"來看的話,若Randomize、rnd有效, 測試數量大的話,每個數中的機率,應該是幾近相同的。 如果您不相信Randomize、rnd的話, 那,機率就是不相同的。 |
引用:
For i = 1 To 39 ball(i) = i Next num = 39 For i = 0 To 5 b1 = Int(Rnd() * num) + 1 '亂數選號 Text1(i).Text = ball(b1) '選中的號碼,放入Text1文字方塊中 ball(b1) = ball(num) num = num - 1 Next i 我不太能理解的是這個for迴圈中ball(b1)=ball(num) 這行不就一直等於39不會改變嗎 :confused: 那這麼做的意義是什麼?? 他下面那行num = num - 1不就也沒有意義?? |
我的寫法,模擬洗牌發牌方式,機率應該比較接近實際吧,參考看看吧
Lotto = rnd_plus( 6, 49 ) '49選6 Function rnd_plus( Vquantity , Vrange ) Randomize ReDim hand_card(Vquantity) ReDim card(Vrange) for i = 1 to Vrange card(i) = i next for j = 1 to Vrange chang_1 = int((Vrange * Rnd) + 1) chang_2 = int((Vrange * Rnd) + 1) temp_card = card(chang_1) card(chang_1) = card(chang_2) card(chang_2) = temp_card next for k = 1 to Vquantity hand_card(k) = card(k) next rnd_plus = hand_card End Function |
引用:
如果想不通,您可以拿一張紙,寫下1~39, 然後,step by step的執行它的程式,應該就會了解。 仔細想想,您就會懂了。 ※ball(b1)=ball(num)是把被抽中的數,用被排除掉的數字(num)代替。 ※num = num - 1,則是控制剩下數字的數量,39、38、37......... |
看來我弄錯的機會很高
先說聲抱歉 明天再來好好想一想 :) |
這想法基本上沒有問題巴? 我在一些基礎程式的書上也有看到~
|
引用:
這樣的作法會不會讓前面6個的出現機率偏高呢? |
| 所有的時間均為GMT +8。 現在的時間是05:22 AM. |
vBulletin Version 3.0.1
powered_by_vbulletin 2025。