当我反复运行这段代码时,
srand 1;
my @x = (1..1000).pick: 100;
say sum @x;
每次我都会得到不同的答案。如果我用srand
重置,为什么不每次都产生相同的随机数呢?
该错误发生在REPL中。
此错误发生在此文件中:
use v6.d;
srand 1;
my $x = rand;
say $x; # OUTPUT: 0.5511548437617427
srand 1;
$x = rand;
say $x; # OUTPUT: 0.308302962221659
say $*KERNEL; # OUTPUT: darwin
我在用:
欢迎来到Rakudo™v2022.07。实现Raku编程语言v6.d。构建在MoarVM版本2022.07上。
发布于 2022-10-22 14:15:15
(这个答案是对基于这个问题打开的GitHub问题中jnthn的评论的转述)。
设置srand 1
将导致产生相同的随机数序列--也就是说,第n个随机数将是相同的。但是,由于Raku (真的,Rakudo和/或MoarVM,假设您使用的是这些后端)在内部使用随机数,所以您在这个序列中并不总是处于相同的位置(也就是说,您的n
可能是不同的),因此您可能不会得到相同的随机数。
Rakudo的优化器使这一问题更加复杂。天真地,在程序后面重复相同的代码应该会消耗相同数量的序列随机数。但是,优化器很可能会从后续调用中删除其中一些随机数的使用,这会导致不同的随机数。
我不清楚当前行为与Rakudo/MoarVM实现中的bug之间的关系;更多细节请参见以前有关联的问题。
发布于 2022-10-08 01:37:13
它应该一直为给定的代码生成相同的数字。我也无法以任何方式重现你的观察。
不过,引擎盖下面可能有什么可怕的东西在发生:
$ raku -e 'srand 1; (my $x = (1..1000).pick(1)).say'
(761)
$ raku -e 'srand 1; (my @x = (1..1000).pick(1)).say'
[471]
表面上,您会说这些值应该是相同的,因为每个值只生成一个值。但是很明显,一个不同的随机值实际上是在引擎盖下计算出来的,从而导致了明显不同的值。你的案子可能就是这样吗?
https://stackoverflow.com/questions/73994411
复制相似问题