(注:有一些类似的问题,但我找不到确切的副本)
问题
考虑一下抛硬币的次数是任意的。你在三尾之前得到两个正面的概率是多少?
码
为了模拟这一点,我设置了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)。
发布于 2014-03-31 02:42:30
一个错误:将while(record=false)更改为while(record==false)。
最重要的是,您的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));代替。
或者,不要处理转换浮点数,而是考虑java.util.Random类。nextInt(int n)函数看起来就像您所需要的。
https://stackoverflow.com/questions/22752681
复制相似问题