相同的 srand 值不应该产生相同的随机数吗?

Jim*_*ger 5 random srand rakudo raku

当我反复运行这段代码时,

\n
srand 1;\nmy @x = (1..1000).pick: 100;\nsay sum @x;\n\n
Run Code Online (Sandbox Code Playgroud)\n

我每次都会得到不同的答案。如果我正在重置,srand为什么它不应该每次都产生相同的随机数?

\n

该错误发生在 REPL 中。

\n

该文件中出现错误:

\n
use v6.d;\n\nsrand 1;\nmy $x = rand;\nsay $x; # OUTPUT: 0.5511548437617427\n\nsrand 1;\n$x = rand;\nsay $x; # OUTPUT: 0.308302962221659\n\nsay $*KERNEL;  # OUTPUT: darwin\n\n
Run Code Online (Sandbox Code Playgroud)\n

我在用着:

\n

欢迎使用 Rakudo\xe2\x84\xa2 v2022.07。\n实现 Raku\xc2\xae 编程语言 v6.d。\n基于 MoarVM 版本 2022.07 构建。

\n

cod*_*ons 1

(这个答案是jnthn在基于这个问题打开的GitHub问题中的评论的释义)。

设置srand 1将导致生成相同序列的随机数——即第n个随机数将相同。然而,由于 Raku(实际上是 Rakudo 和/或 MoarVM,假设您正在使用这些后端)在内部使用随机数,因此您不会始终处于该序列中的相同位置(即,您的位置n可能不同),因此您可能无法获得相同的随机数。

Rakudo 的优化器使这变得更加复杂。天真地,稍后在程序中重复相同的代码应该消耗序列中相同数量的随机数。但是,优化器很可能会从后续调用中删除其中一些随机数使用,这可能会导致不同的随机数。

我不清楚当前行为的目的与 Rakudo/MoarVM 实现中的错误相比有多大程度的影响;请参阅之前链接的问题以了解更多详细信息。