在srand
的文档中,它说:
另一种情况是,您可能需要在"叉"之后调用" srand",以避免儿童处理与父母相同的种子价值(因此彼此之间)。
我可以发誓我从未遇到过这个,所以我对其进行了测试:
$ 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
:
$ 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
启动时不会设置;首先调用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
的代码)。