2016-01-30 39 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

好東西;我讚賞這種闡述 –