PCDVD數位科技討論區

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)

=風= 2008-09-21 10:07 PM

b1 = Int(Rnd() * num) + 1 '亂數選號
Debug.Print b1 <==此句程式碼新增加作測式

發現Debug.Print b1
若是跑出之前的號碼
此程式會從39、38、37、36、35
這幾個號碼選出來
我懷疑
這個程式
39、38、37、36、35這幾個號碼出現機率特別高
這是我的懷疑
沒把握

twu2 2008-09-21 10:16 PM

這樣說的話, 你是懷疑 VB 的 Rnd() 的亂數表不夠亂了? (難道自己寫一個亂數產生的函式就能保證一定夠亂了嗎?)
基本上這與上頭程式的邏輯無關吧.

8:5 2008-09-21 10:18 PM

這個程式看起來沒甚麼問題。

slamcar 2008-09-21 10:20 PM

引用:
作者=風=
b1 = Int(Rnd() * num) + 1 '亂數選號
Debug.Print b1 <==此句程式碼新增加作測式

發現Debug.Print b1
若是跑出之前的號碼
此程式會從39、38、37、36、35
這幾個號碼選出來
我懷疑
這個程式
39、38、37、36、35這幾個號碼出現機率特別高
這是我的懷疑
沒把握



以"理論"來看的話,若Randomize、rnd有效,

測試數量大的話,每個數中的機率,應該是幾近相同的。

如果您不相信Randomize、rnd的話,

那,機率就是不相同的。

53346 2008-09-21 10:24 PM

引用:
作者slamcar
這是ok的。因為假設第一次抽中20
ball(b1) = ball(num)
>>ball(20) = ball(39)--->ball(20)會等於39
so~ball(1~38)裡是1~19、39、21~38,
20被排除了,39取代20,要抽中39的話,只要再抽中一次20就是了。


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不就也沒有意義??

michelle_lai529 2008-09-21 10:24 PM

我的寫法,模擬洗牌發牌方式,機率應該比較接近實際吧,參考看看吧

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

slamcar 2008-09-21 10:36 PM

引用:
作者53346
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不就也沒有意義??


如果想不通,您可以拿一張紙,寫下1~39,

然後,step by step的執行它的程式,應該就會了解。

仔細想想,您就會懂了。

※ball(b1)=ball(num)是把被抽中的數,用被排除掉的數字(num)代替。
※num = num - 1,則是控制剩下數字的數量,39、38、37.........

=風= 2008-09-21 10:37 PM

看來我弄錯的機會很高
先說聲抱歉
明天再來好好想一想
:)

blake348 2008-09-21 10:42 PM

這想法基本上沒有問題巴? 我在一些基礎程式的書上也有看到~

Statics 2008-09-21 10:53 PM

引用:
作者michelle_lai529
我的寫法,模擬洗牌發牌方式,機率應該比較接近實際吧,參考看看吧

這樣的作法會不會讓前面6個的出現機率偏高呢?


所有的時間均為GMT +8。 現在的時間是05:22 AM.

vBulletin Version 3.0.1
powered_by_vbulletin 2025。