作者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://webptt.com/cn.aspx?n=bbs/java/M.1525678235.A.9AA.html
1F:推 marx93521: winOne跟winAll是不是重复计算到了? 05/07 15:39
2F:→ jej: 看到double就要小心IEEE的限定 05/07 19:50
3F:推 wemee: IEEE 754 我中招很多次 05/08 12:29
4F:→ FromTo: 二中一的判断式有误,会包含二中二。包含A(B)&&不包含B(A) 05/08 14:35
5F:推 nicknick0630: 你检查中奖的第一行不对 (A||B) A是true就不会管B 05/08 18:44
6F:→ nicknick0630: 是怎样了 05/08 18:44
7F:→ taco2548: 但我2中2是另外写if,并不是写else if,,这样也不行吗? 05/08 21:01
8F:推 nicknick0630: 如果你get(0)和get(1)都是true 05/09 01:36
9F:→ nicknick0630: 他就会直接执行winOne++ 05/09 01:36
10F:→ nicknick0630: 然後到下面又winAll++一次 05/09 01:36
11F:→ nicknick0630: 所以你第一个if判断的地方出错了 05/09 01:36
感谢,问题已解,还是乖乖写else if写好写满QQ
※ 编辑: taco2548 (223.141.198.211), 05/09/2018 08:01:08
12F:→ ssccg: 就是因为另外写if才会错啊 05/09 13:09
13F:→ ssccg: A and B就已经包含在A or B里面了 05/09 13:09
14F:→ ssccg: 只写if 不用else的话,每个条件都必须不会互相包含 05/09 13:11
15F:→ ssccg: 写if else if 要由不包含其他条件的依序放宽 05/09 13:12
16F:→ ssccg: 逻辑观念的问题比较大 05/09 13:13
17F:推 gmoz: 你需要先知道一下if()里面是怎麽运作的 05/09 16:30