gpt4 book ai didi

perl - 如果您不设置种子,为什么子进程不会产生相同的随机数?

转载 作者:行者123 更新时间:2023-12-03 23:48:56 24 4
gpt4 key购买 nike

srand 的文档中,它说:

Another case is that you may want to call "srand" after a "fork" to avoid child processes sharing the same seed value as the parent (and consequently each other).

我可以发誓我从来没有遇到过这个,所以我测试了它:

$ 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 时它被设置。在第一种情况下,首先在每个 child 中调用 rand,因此每个 child 都有自己的种子。如果您在父级中调用 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

因此,如果您需要确定 child 有不同的随机种子,他们需要在开始时调用 srand(因为您永远不知道什么代码可能调用 srand或父级中的 rand)。

关于perl - 如果您不设置种子,为什么子进程不会产生相同的随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41066993/

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