Math.Random中的StackOverflowError是一种随机递归方法

Fab*_*out 11 java algorithm

这是我的计划的背景.

一个函数有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.

  • 哈哈,我不是为了声誉.我喜欢帮助别人:p (3认同)