我试图模拟我在http://blog.xkcd.com/2010/02/09/math-puzzle/上找到的数学难题.但是,java随机类返回了奇怪的结果.在下面的代码中,结果是预期的结果.第一行的输出大约为.612,第二行的输出大约为.49到.51.int试验= 10000000; int success = 0;
int returnstrue = 0;
for (int i = 0; i < trials; i++) {
Random r = new Random();
//double one = r.nextDouble()*10000;
//double two = r.nextDouble()*10000;
double one = 1;
double two = Math.PI;
double check = r.nextDouble();
boolean a = r.nextBoolean();
if(a)
{
returnstrue++;
}
if(a){
if((check>p(one)) && two > one)
{
success++;
}
if((check<p(one))&& two<one)
{
success++;
}
}
else{
if((check>p(two)) && two < one)
{
success++;
}
if((check<p(two))&& two>one)
{
success++;
}
}
}
System.out.println(success/(double)trials);
System.out.println(returnstrue/(double)trials);
Run Code Online (Sandbox Code Playgroud)
但是,当我切换线路时
double check = r.nextDouble();
boolean a = r.nextBoolean();
Run Code Online (Sandbox Code Playgroud)
至
boolean a = r.nextBoolean();
double check = r.nextDouble();
Run Code Online (Sandbox Code Playgroud)
第一个数字的输出约为.476,第二个数字的输出约为.710.这意味着nextBoolean()方法在后面的配置中70%的时间返回true.我做错了什么或者这只是一个错误?
pax*_*blo 12
移动的实例化r到外面的for循环,如:
Random r = new Random();
for (int i = 0; i < trials; i++) {
:
}
Run Code Online (Sandbox Code Playgroud)
您现在正在做的是每次循环迭代时创建一个新的,并且由于种子基于时间(毫秒),您可能会使用相同的种子获得相当多的.
这几乎可以肯定是什么扭曲了你的结果.
所以,是的,这是一个错误,只是在你的代码中而不是在Java中.当人们提出这个问题时,大约99.9999%的情况就是这种情况,因为Java本身正在被全世界数百万人持续测试,而你的片段已经过测试,好吧,只有你:-)