gpt4 book ai didi

arrays - 为什么这个随机哈希值选择器在第一次被调用时总是返回相同的值?

转载 作者:行者123 更新时间:2023-12-04 10:56:02 26 4
gpt4 key购买 nike

同时试图了解如何refp's solution对于随机哈希值选择工作,我注意到一些奇怪的事情。

通过重复调用以下 Perl 脚本,我始终发现返回的第一个结果是相同的。随后返回的值是随机的:

use strict;
use warnings;
use 5.010;

my %hash = map { $_ => ord $_ } 'a' .. 'z';

say( (@_=%hash)[1|rand@_] ) for 1 .. 10; # First value always 119

有趣的是,以下内容不受此问题的影响:
sub random_value { ( @_ )[ 1 | rand @_ ] }

say random_value %hash for 1 .. 10; # First value is random

删除对 @_ 的引用也解决了这个问题:
say( (%hash)[1|rand keys %hash] ) for 1 .. 10; # First value is random

这已经在 Windows (ActivePerl 5.14.2) 上测试过了。

从表面上看,它就像设置 @_与它有关,但我不确定。任何人都可以对这里发生的事情有所了解吗?

编辑

我以为直到 refp provided an update 才回答这个问题.为什么 arrayref 表单不会遇到上面讨论的相同问题? :
[@_=%hash]->[1|rand@_] for 1 .. 10;            # First value is random

最佳答案

我怀疑存在竞争条件,其中 @_未在第一次循环迭代中定义。

say( (@_=%hash)[1|rand@_] ) for 1 .. 10; 

会变成
say( (@_=%hash)[1|rand ()] ) for 1 .. 10; 

它逃脱了 warnings因为 @_是一个预先声明的变量。你会注意到:
say( (my @a=%hash)[1|rand@a] ) for 1 .. 10;   

会崩溃烧毁,因为 @a后记中没有定义。

更新:
[@_=%hash]->[1|rand@_] for 1 .. 10;    

没有什么不同。在分配变量的同一语句中使用变量仍然是不好的做法。我猜,不同之处在于优先级有所改变,因此首先评估分配。

关于arrays - 为什么这个随机哈希值选择器在第一次被调用时总是返回相同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8554060/

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