이것은 내 프로그램의 컨텍스트입니다.무작위로 재귀 적 메서드 인 Math.Random의 StackOverflowError
함수에는 아무 것도하지 않을 확률이 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)
. 스택이 의심스럽고 기능이 제한되어 있지만 여기에는 문제가 실제로 표시되지 않습니다.
모든 조언이나 단서를 환영합니다.
파비앙
편집 : 감사합니다 귀하의 답변을, 나는 자바 -Xss4m 그것을 실행하고 큰했다.
나는 이것이 대부분의 시간을 종료 할 것이라고 생각하지만, 1000 번 호출하기 때문에 재귀 톤의 스택에서 스택 오버플로를 얻는 것이 거의 확실합니다. –
'random()'에서 발생하는 것은 단지 우연의 일치입니다. 원인은'loop()'에서 깊은 재귀입니다. – kiheru
"항상 끝내고"있는 논리의 문제는 [당신이 상실한 후에도 내기를 두 배로 늘릴 수 있다는] 논리의 뒷부분과 동일합니다. (http://en.wikipedia.org/wiki/Martingale_ % 28betting_system % 29) : 불운은 스택을 넘치게하거나 지갑을 비울만큼 길어질 행진이 있어야합니다. – dasblinkenlight