如果不设置种子,为什么子进程不能生成相同的随机数?

时间:2016-12-09 18:48:57

标签: perl seed srand

srand的文档中,它说:

  

另一种情况是你可能想在“fork”之后调用“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

因此,如果您在父级中设置种子,则子级都将获得相同的值。为什么不在第一个例子中发生这种情况?

1 个答案:

答案 0 :(得分: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(因为你永远不知道代码可能会调用srandrand在父母)。

相关问题