这是我的计划的背景.
一个函数有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;
}
Run Code Online (Sandbox Code Playgroud)
.
java.lang.StackOverflowError
at java.util.Random.nextDouble(Random.java:394)
at java.lang.Math.random(Math.java:695)
Run Code Online (Sandbox Code Playgroud)
.我怀疑堆栈及其中的功能数量是有限的,但我真的没有看到这里的问题.
任何建议或线索显然都是受欢迎的.
法比恩
编辑:谢谢你的答案,我用java -Xss4m运行它,它工作得很好.
Lev*_*usa 14
无论何时调用函数或创建非静态变量,堆栈都用于为其放置和保留空间.
现在,您似乎在递归地调用该loop函数.这将参数放在堆栈中,以及代码段和返回地址.这意味着很多信息都被放在堆栈上.
但是,堆栈是有限的.CPU具有内置的机制,可以防止数据被压入堆栈的问题,并最终覆盖代码本身(随着堆栈的增长).这被称为a General Protection Fault.发生一般保护故障时,操作系统会通知当前正在运行的任务.因此,起源于Stackoverflow.
这似乎正在发生Math.random().
为了解决您的问题,我建议您使用-Xss选项增加堆栈大小Java.