gpt4 book ai didi

java - 随机递归方法中 Math.Random 中的 StackOverflowError

转载 作者:搜寻专家 更新时间:2023-10-30 21:20:35 25 4
gpt4 key购买 nike

这是我程序的上下文。

一个函数有 50% 的机会什么都不做,50% 的机会调用它自己两次。程序完成的概率是多少?

这段代码是我写的,显然效果很好。答案可能不是每个人都清楚的是这个程序有 100% 的机会完成。但是当我运行这个程序时,在 Math.Random() 中出现了 StackOverflowError(多么方便 ;))。有人可以指出它是从哪里来的,并告诉我我的代码是否有误吗?

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 运行它并且效果很好。

最佳答案

每当一个函数被调用或者一个非静态变量被创建时,栈就是用来为它放置和预留空间的。

现在,您似乎正在递归调用 loop 函数。这会将参数连同代码段和返回地址一起放入堆栈。这意味着大量信息被放置在堆栈中。

但是,堆栈是有限的。 CPU 具有内置机制,可以防止数据被插入堆栈并最终覆盖代码本身(随着堆栈向下增长)的问题。这称为 General Protection Fault。当一般保护故障发生时,操作系统会通知当前正在运行的任务。因此,发起了 Stackoverflow

这似乎发生在 Math.random() 中。

为了解决您的问题,我建议您使用 Java 的 -Xss 选项增加堆栈大小。

关于java - 随机递归方法中 Math.Random 中的 StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18125760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com