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)

michelle_lai529 2008-09-21 11:03 PM

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

以交換的方式,先把牌洗亂了,亂數取出1∼倒數第2張,跟最後1張交換,再亂數取出1∼倒數第3張跟最後第2張交換...以此類推,每張牌都換過一次,牌也洗的夠亂了,然後要幾張牌,就發幾張,也沒有什麼重複或是比較容易出現的問題了

MrHermes 2008-09-21 11:05 PM

大樂透是49 選 6 吧.... :unbelief: 我已經槓到快脫褲子了別想唬弄我.

seiws 2008-09-21 11:10 PM

完全看不出來程式有什麼問題
不可能有重覆數字
別說
For i = 0 To 5
即使
For i = 0 To 38
也不會重複

雖然我vb很爛,但這樣子的結果應該不會錯

qw334353 2008-09-21 11:31 PM

離題一下...如果用PHP這樣寫,機率是否會跟實際的樂透理論一樣?

$ball=array(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36);
unset($ball[0]);
for($c=0;$c<=5;$c++){
$keys=array_rand($ball,1);
unset($ball[$keys]);
print $keys."\n";
}

passerx 2008-09-21 11:37 PM

vb沒學過,不過這個程式....

第1次如果不是39,下一次39就會消失,對於39而言下5次選中的機率等於0,
第2次如果不是38,下一次38就會消失,對於38而言下4次選中的機率等於0,
第3次如果不是37,下一次37就會消失,對於37而言下3次選中的機率等於0,
第4次如果不是36,下一次36就會消失,對於36而言下2次選中的機率等於0,
第5次如果不是35,下一次35就會消失,對於35而言下1次選中的機率等於0,

就選中的機率而言39,38,37,36,35這幾個數跟其他數是不一樣的,
所以.....此程式是不公平的.

另外這種程式是會有重復數字的.

Paulfang 2008-09-22 12:00 AM

引用:
作者passerx
vb沒學過,不過這個程式....

第1次如果不是39,下一次39就會消失,對於39而言下5次選中的機率等於0,
第2次如果不是38,下一次38就會消失,對於38而言下4次選中的機率等於0,
第3次如果不是37,下一次37就會消失,對於37而言下3次選中的機率等於0,
第4次如果不是36,下一次36就會消失,對於36而言下2次選中的機率等於0,
第5次如果不是35,下一次35就會消失,對於35而言下1次選中的機率等於0,

就選中的機率而言39,38,37,36,35這幾個數跟其他數是不一樣的,
所以.....此程式是不公平的.

另外這種程式是會有重復數字的.

真神人出現了嗎
:D

lemming 2008-09-22 12:03 AM

引用:
作者passerx
vb沒學過,不過這個程式....

第1次如果不是39,下一次39就會消失,對於39而言下5次選中的機率等於0,
第2次如果不是38,下一次38就會消失,對於38而言下4次選中的機率等於0,
第3次如果不是37,下一次37就會消失,對於37而言下3次選中的機率等於0,
第4次如果不是36,下一次36就會消失,對於36而言下2次選中的機率等於0,
第5次如果不是35,下一次35就會消失,對於35而言下1次選中的機率等於0,

就選中的機率而言39,38,37,36,35這幾個數跟其他數是不一樣的,
所以.....此程式是不公平的.

另外這種程式是會有重復數字的.


你應該沒看清楚喔
迴圈裡有兩行是
ball(b1) = ball(num)
num = num - 1

這兩行會解決你提出的問題

8:5 2008-09-22 12:04 AM

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

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

洗完牌後,會亂,但是不會亂得很均勻。

比如說,rnd_plus(49,49) 有可能產生的洗牌結果有 49! 種。
如果是樂透的話,我們會期望每一種發生的機率都是 1/49!。
但是洗牌的結果顯然不會 1/49!...

比如說,我們要依照這個演算法,洗完牌後,順序剛好完全倒置的機率?
因為程式總共取了 2*49 次的亂數,每個亂數有 1-49 種可能。
所以樣本空間是 49^98。

其中某 X 種樣本,洗完後會完全倒置,則剛好導置的機率是.. X / 49^98。
但不管 X 是多少, X / 49^98 都不會是 1/49!

同樣的,我們想算洗完牌後,1,2 剛好交換,其餘都不動的機率?
那會是 Y / 49^98,也不會是 1/49!。

--
如果對於上面的描述很難體會的話,跑 rnd_plus(3,3) 幾萬次,統計一下結果看看...

bean01 2008-09-22 12:07 AM

引用:
作者passerx
vb沒學過,不過這個程式....

第1次如果不是39,下一次39就會消失,對於39而言下5次選中的機率等於0,
第2次如果不是38,下一次38就會消失,對於38而言下4次選中的機率等於0,
第3次如果不是37,下一次37就會消失,對於37而言下3次選中的機率等於0,
第4次如果不是36,下一次36就會消失,對於36而言下2次選中的機率等於0,
第5次如果不是35,下一次35就會消失,對於35而言下1次選中的機率等於0,

就選中的機率而言39,38,37,36,35這幾個數跟其他數是不一樣的,
所以.....此程式是不公平的.

另外這種程式是會有重復數字的.



請參考 selection sort 的演算法

八豆妖 2008-09-22 12:27 AM

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

我也覺的自己寫, 也很難"夠"亂, 如果可以寫出一定"亂的". 個人覺的可以賣錢
但要有數學式佐證..

真想知道答案是什麼... 不過如果我會 vb 的話, 我大楖會跑個 100 萬次
看是不是很平均落在 1 ~ 39 吧, 以及第一次中獎的數字為何, 依序下去...等等


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

vBulletin Version 3.0.1
powered_by_vbulletin 2025。