这是我的程序的上下文。
一个函数有 50% 的机会什么都不做,有 50% 的机会调用自己两次。程序完成的概率是多少?
我写了这段代码,它显然工作得很好。对每个人来说可能并不明显的答案是这个程序有 100% 的机会完成。但是当我运行这个程序时有一个 StackOverflowError(多么方便;)),发生在 Math.Random() 中。有人可以指出它来自哪里,并告诉我我的代码是否错误?
static int bestDepth =0;
static int numberOfPrograms =0;
@Test
public void testProba(){
for(int i = 0; i <1000; i++){
long time = System.currentTimeMillis();
bestDepth = 0;
numberOfPrograms = 0;
loop(0);
LOGGER.info("Best depth:"+ bestDepth +" in "+(System.currentTimeMillis()-time)+"ms");
}
}
public boolean loop(int depth){
numberOfPrograms++;
if(depth> bestDepth){
bestDepth = depth;
}
if(proba()){
return true;
}
else{
return loop(depth + 1) && loop(depth + 1);
}
}
public boolean proba(){
return Math.random()>0.5;
}
.
java.lang.StackOverflowError
at java.util.Random.nextDouble(Random.java:394)
at java.lang.Math.random(Math.java:695)
. 我怀疑堆栈和其中的函数数量是有限的,但我并没有真正看到这里的问题。
显然欢迎任何建议或线索。
法比安
编辑:感谢您的回答,我用 java -Xss4m 运行它,效果很好。