作者taco2548 (T@cO)
看板java
標題[問題] 樂透數學問題
時間Mon May 7 15:30:31 2018
小弟我對於樂透機率小有疑問
於是寫了個簡單的程式來跑一下
但不管怎麼跑總是搭不起來
我的問題如下
樂透49個號碼,我只簽2個號碼
要求出
2中0
2中1
2中2
三種狀況的機率
自己直接用公式算完的機率分別是
2中0 = 0.767857143
2中1 = 0.219387755
2中2 = 0.012755102
但是我自己寫了程式下去跑
機率總和永遠大於1
雖然誤差一定會有
但是這怎麼看都不太像是誤差QQ
想請各位前輩幫忙看看是否程式寫錯或是邏輯觀念錯誤
------------------------------------------
int count = 10000000; //跑一千萬次
int winOne = 0;
int winAll = 0;
int noWin = 0;
ArrayList<Integer> numList;
ArrayList<Integer> myNumList;
for (int i = 0; i < count; i++) {
numList = new ArrayList<>();
myNumList = new ArrayList<>();
//產生一組樂透號碼,6個數字
for (int n = 0; numList.size() < 6; n++) {
int num = (int) (Math.random() * 49 + 1);
if (!numList.contains(num)) {
numList.add(num);
}
}
//產生一組我的號碼,2個數字
for (int n = 0; myNumList.size() < 2; n++) {
int num = (int) (Math.random() * 49 + 1);
if (!myNumList.contains(num)) {
myNumList.add(num);
}
}
//檢查中獎
if (numList.contains(myNumList.get(0)) ||
numList.contains(myNumList.get(1)))
{
winOne += 1;
}
else
{
noWin += 1;
}
if (numList.contains(myNumList.get(0)) &&
numList.contains(myNumList.get(1)))
{
winAll += 1;
}
}
System.out.println("二中零機率 = " + (double) noWin / count );
System.out.println("二中一機率 = " + (double) winOne / count );
System.out.println("二中二機率 = " + (double) winAll / count );
System.out.println("加總 = " + (double) (noWin+winOne+winAll ) / count );
------------------------
本來想說自己看懂就好
所以程式寫得滿簡陋的請各位多多包涵
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.141.198.211
※ 文章網址: https://www.ptt.cc/bbs/java/M.1525678235.A.9AA.html
推 marx93521: winOne跟winAll是不是重複計算到了? 05/07 15:39
→ jej: 看到double就要小心IEEE的限定 05/07 19:50
推 wemee: IEEE 754 我中招很多次 05/08 12:29
→ FromTo: 二中一的判斷式有誤,會包含二中二。包含A(B)&&不包含B(A) 05/08 14:35
推 nicknick0630: 你檢查中獎的第一行不對 (A||B) A是true就不會管B 05/08 18:44
→ nicknick0630: 是怎樣了 05/08 18:44
→ taco2548: 但我2中2是另外寫if,並不是寫else if,,這樣也不行嗎? 05/08 21:01
推 nicknick0630: 如果你get(0)和get(1)都是true 05/09 01:36
→ nicknick0630: 他就會直接執行winOne++ 05/09 01:36
→ nicknick0630: 然後到下面又winAll++一次 05/09 01:36
→ nicknick0630: 所以你第一個if判斷的地方出錯了 05/09 01:36
感謝,問題已解,還是乖乖寫else if寫好寫滿QQ
※ 編輯: taco2548 (223.141.198.211), 05/09/2018 08:01:08
→ ssccg: 就是因為另外寫if才會錯啊 05/09 13:09
→ ssccg: A and B就已經包含在A or B裡面了 05/09 13:09
→ ssccg: 只寫if 不用else的話,每個條件都必須不會互相包含 05/09 13:11
→ ssccg: 寫if else if 要由不包含其他條件的依序放寬 05/09 13:12
→ ssccg: 邏輯觀念的問題比較大 05/09 13:13
推 gmoz: 你需要先知道一下if()裡面是怎麼運作的 05/09 16:30