2016-12-09 8 views
2

, 그것은 말한다 :시드를 설정하지 않은 경우 하위 프로세스가 동일한 난수를 생성하지 않는 이유는 무엇입니까? <code>srand</code>에 대한 문서에서

또 다른 경우는 (부모와 같은 시드 값을 공유하는 자식 프로세스를 피하기 위해 "포크"후 "부터 srand"결과적으로 각을 호출 할 수 있다는 것입니다 다른).

나는이 우연히 결코 맹세 할 수있다, 그래서 그것을 테스트 :

$ perl -E 'srand; for (1 .. 8) { next if fork; say rand; exit;} wait for 1 .. 8' 
0.13028028358622 
0.13028028358622 
0.13028028358622 
0.13028028358622 
0.13028028358622 
0.13028028358622 
0.13028028358622 
0.13028028358622 

를 따라서, 경우 :

$ perl -E 'for (1 .. 8) { next if fork; say rand; exit;} wait for 1 .. 8' 
0.301967407417582 
0.497966311014356 
0.05798998109913 
0.907357103963481 
0.240495550287054 
0.74279685605234 
0.368774714022042 
0.562179033951001 

가 그럼 난 srand와 부모의 씨앗을 설정 테스트를 당신은 부모에서 씨앗을 설정, 아이들은 모두 동일한 가치를 얻을. 첫 번째 예에서 왜 이런 일이 발생하지 않습니까?

답변

8

트릭은 시드가 설정되면 발생합니다. perl이 시작되면 설정되지 않습니다. rand이 처음 호출되면 설정됩니다. 첫 번째 경우에는 rand이 먼저 각 자식에서 호출되므로 각 자식은 자체 시드를 가져옵니다. 상위에 rand를 호출 할 경우이를 볼 수 있습니다

$ perl -E 'say "parent: ", rand; for (1 .. 8) { next if fork; say "$$: ", rand; exit;} wait for 1 .. 8' 
parent: 0.931186094953777 
60700: 0.105917756769003 
60701: 0.105917756769003 
60702: 0.105917756769003 
60703: 0.105917756769003 
60704: 0.105917756769003 
60705: 0.105917756769003 
60706: 0.105917756769003 
60707: 0.105917756769003 

그래서 당신은 아이들이 다른 임의의 씨앗을 가지고 있음을 확신 할 필요가 있다면, 그들은 당신이 모르는 때문에 그들이 (시작할 때 srand를 호출 할 필요 코드 할 수있다 부모의 srand 또는 rand으로 전화하십시오.