2016-01-30 71 views
5

一个快速且有希望的简单问题:如何在Perl 6中获得随机选择的哈希键?

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

my %a = 1,2,3,4,5,6; 

鉴于上述情况,

%a.keys; 

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

%a.rand; 

我得到一个伪随机浮动,而不是任何一个键。

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

+0

我最终鹅卵石 '%a.keys [INT(%a.elems.rand)一起' 但八九不离十希望简单,我猜。 –

回答

9

使用pickroll,如

%a.keys.pick 
+5

关于使用pick()使我绊倒的事情的一个注意事项:如果你想从列表中选择多个元素,不重复,请用你想要的数字调用一次。每次你打电话给它,它都会重新开始,并且可以重复一遍。换句话说,要从甲板上抽取5张牌,请执行以下操作:my @hand = @ deck.pick(5);不是:我的$ card1 = @ deck.pick;我的$ card2 = @deck。挑; #等 –

+0

还有:'%a.pick.key' –

6

像往常一样,Christoph's answer是正确的(他知道Perl 6的好)。不过,我想我会详细说明一下,因为pickroll起初很容易混淆。


如果你只想要一个随机密钥,然后pickroll似乎相同的,可以互换使用:

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

my $rand-keyB = %a.keys.roll; 

不过,联想的pick为“我有ñ东西,我正在从容器中挑选它们,一旦它们消失,它们就消失了(对于这个选择)“与roll相比“我有一个N骰子,我正在滚动”。

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) 

pick(*)是创建一个数组随机顺序列表,而不必知道它有多少元素有一个简单的方法:

my @array = <foo bar baz foobar>; 

@array.pick(*); # (bar foobar baz foo) 

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 
+0

好东西;我赞赏这种阐述 –