如何在Perl 6中获得随机选择的哈希键?

Jos*_*tte 8 random hash key rakudo perl6

一个快速而有希望的简单问题:

我需要随机选择一组给定散列键的方法.关于randHash的perl6.org文档提供了许多提示.

my %a = 1,2,3,4,5,6;
Run Code Online (Sandbox Code Playgroud)

鉴于上述情况,

%a.keys;
Run Code Online (Sandbox Code Playgroud)

回来(5 1 3),如果我只是尝试

%a.rand;
Run Code Online (Sandbox Code Playgroud)

我得到一个伪随机浮点而不是任何一个键.

我最终拼凑在一起%a.keys[Int(%a.elems.rand)],但希望更简单.

Chr*_*oph 12

使用pickroll,例如

%a.keys.pick
Run Code Online (Sandbox Code Playgroud)

  • 关于使用pick()绊倒的东西的一个注释:如果你想从列表中选择多个元素,不重复,请用你想要的号码选择一次.每次调用它时,它都会以完整列表重新开始,并且可以再次重复元素.换句话说,要从牌组中抽出5张牌,请执行以下操作:my @hand = @ deck.pick(5); 不是:我的$ card1 = @ deck.pick; 我的$ card2 = @ deck.pick; #等 (5认同)

Chr*_*oms 9

一如既往,Christoph的答案是正确的(他很了解Perl 6).不过,我想我会详细说明了一点,因为pickroll可以很容易地在第一混淆.


如果你只想要一个随机项,那么pick看起来是相同的并且可以互换使用,因为它们都默认从原始列表或数组中返回一个项:roll

my $rand-keyA = %a.keys.pick;

my $rand-keyB = %a.keys.roll;
Run Code Online (Sandbox Code Playgroud)

然而,认为他们是这样的:
pick指"由于只有ñ事情在该容器中,我只能高达ñ一次的事情."
roll意思是"我有一个N面骰子,我可以按照我想要的次数滚动."

my %a = 1,2,3,4,5,6;  # { 1 => 2, 3 => 4, 5 => 6 }
                      # (i.e. keys are 1, 3, and 5)

say %a.keys.pick(2);  # (5 3)
say %a.keys.pick(2);  # (3 1)
say %a.keys.pick(5);  # (3 5 1) no more, because there were only three to pick from
say %a.keys.pick(10); # (3 1 5) 

say %a.keys.roll(5);  # (1 5 1 5 3)           as many "rolls" as you request
say %a.keys.roll(10); # (5 5 1 1 5 5 3 1 3 1) 
Run Code Online (Sandbox Code Playgroud)

pick(*)是一种从数组创建随机重新排序列表的简单方法,无需知道它有多少元素:

my @array = <foo bar baz foobar>;

@array.pick(*); # (bar foobar baz foo)
Run Code Online (Sandbox Code Playgroud)

roll(*)是一种创建无限列表的简单方法,其元素是从原始数组中随机选择的:

my @rolls = @array.roll(*);

say @rolls[0];         # foobar
say @rolls[10];        # bar
say @rolls[351];       # baz
say @rolls[19123];     # foobar
say @rolls[1000000];   # bar
say @rolls[1000001];   # bar
say @rolls[1000002];   # foo
Run Code Online (Sandbox Code Playgroud)