[問題] 樂透數學問題

看板java作者 (T@cO)時間6年前 (2018/05/07 15:30), 6年前編輯推噓5(5012)
留言17則, 8人參與, 6年前最新討論串1/1
小弟我對於樂透機率小有疑問 於是寫了個簡單的程式來跑一下 但不管怎麼跑總是搭不起來 我的問題如下 樂透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

05/07 15:39, 6年前 , 1F
winOne跟winAll是不是重複計算到了?
05/07 15:39, 1F

05/07 19:50, 6年前 , 2F
看到double就要小心IEEE的限定
05/07 19:50, 2F

05/08 12:29, 6年前 , 3F
IEEE 754 我中招很多次
05/08 12:29, 3F

05/08 14:35, 6年前 , 4F
二中一的判斷式有誤,會包含二中二。包含A(B)&&不包含B(A)
05/08 14:35, 4F

05/08 18:44, 6年前 , 5F
你檢查中獎的第一行不對 (A||B) A是true就不會管B
05/08 18:44, 5F

05/08 18:44, 6年前 , 6F
是怎樣了
05/08 18:44, 6F

05/08 21:01, 6年前 , 7F
但我2中2是另外寫if,並不是寫else if,,這樣也不行嗎?
05/08 21:01, 7F

05/09 01:36, 6年前 , 8F
如果你get(0)和get(1)都是true
05/09 01:36, 8F

05/09 01:36, 6年前 , 9F
他就會直接執行winOne++
05/09 01:36, 9F

05/09 01:36, 6年前 , 10F
然後到下面又winAll++一次
05/09 01:36, 10F

05/09 01:36, 6年前 , 11F
所以你第一個if判斷的地方出錯了
05/09 01:36, 11F
感謝,問題已解,還是乖乖寫else if寫好寫滿QQ ※ 編輯: taco2548 (223.141.198.211), 05/09/2018 08:01:08

05/09 13:09, 6年前 , 12F
就是因為另外寫if才會錯啊
05/09 13:09, 12F

05/09 13:09, 6年前 , 13F
A and B就已經包含在A or B裡面了
05/09 13:09, 13F

05/09 13:11, 6年前 , 14F
只寫if 不用else的話,每個條件都必須不會互相包含
05/09 13:11, 14F

05/09 13:12, 6年前 , 15F
寫if else if 要由不包含其他條件的依序放寬
05/09 13:12, 15F

05/09 13:13, 6年前 , 16F
邏輯觀念的問題比較大
05/09 13:13, 16F

05/09 16:30, 6年前 , 17F
你需要先知道一下if()裡面是怎麼運作的
05/09 16:30, 17F
文章代碼(AID): #1Qy02Rcg (java)