(注意:有一些类似的问题,但我找不到完全重复的问题)
问题
考虑抛硬币任意次数。在得到 3 个反面之前得到 2 个正面的概率是多少?
代码
为了模拟这一点,我设置了 10000000 次试验,其中 0 是正面,1 是反面,等等。
ArrayList<Integer> listOfTosses=new ArrayList<Integer>();
int numTrue=0;
int numTrials=0;
while(numTrials<10000000)
{
boolean record=false;
boolean twoHeads=false;
int counter=2;
listOfTosses.add((int) Math.random()*2);
listOfTosses.add((int) Math.random()*2);
if(listOfTosses.get(0)==0 && listOfTosses.get(1)==0)
{
twoHeads=true;
record=true;
}
listOfTosses.add((int) Math.random()*2);
while(record=false)
{
if(listOfTosses.get(counter)==0 && listOfTosses.get(counter-1)==0)
{
twoHeads=true;
record=true;
}
if(listOfTosses.get(counter)==1
&& listOfTosses.get(counter-1)==1
&& listOfTosses.get(counter-2)==1)
{
twoHeads=false;
record=true;
}
listOfTosses.add((int) Math.random()*2);
counter++;
}
if(twoHeads==true)
{
numTrue++;
}
record=false;
twoHeads=false;
listOfTosses.clear();
numTrials++;
}
System.out.print(numTrue/10000000.0);
问题
代码可以正确编译,但总是给出 1.0 的答案(可以从数学上证明确切的答案是 0.7)。
最佳答案
一个拼写错误:更改 while(record=false)
至while(record==false)
.
最重要的是,您的while
while record == false
运行的循环没有运行。这是因为listOfTosses.get(0)
和listOfTosses.get(1)
都设置为 0。
当你这样做时listOfTosses.add((int) Math.random()*2);
,它实际上相当于 listOfTosses.add(((int) Math.random()) * 2);
。自 Math.random() < 1
,它会变成 0。执行 listOfTosses.add((int) (Math.random()*2));
相反。
或者,不处理转换 float ,而是考虑 java.util.Random类(class)。 nextInt(int n)
功能看起来像您所需要的。
关于java - 模拟抛硬币得到 2 正面 3 反面 (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22752681/