2016-01-30 18 views
5

素早くうまくいけば簡単な質問:Perl 6でランダムに選択されたハッシュキーを取得するにはどうすればよいですか?

ランダムに与えられたハッシュキーの中から選択する手段が必要です。 randでもHashでもない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

使用pickまたはroll、例えば

%a.keys.pick 
+5

pick()を使って私を引きつけたものの1つのメモ:リストから複数の要素を選択したい場合は、繰り返しません。あなたがそれを呼び出すたびに、それは完全なリストから始まり、要素を再び繰り返すことができます。つまり、デッキから5枚のカードを引き出すには、以下のようにします:my @hand = @ deck.pick(5);そうではない:my $ 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; 

しかし、私はNを持っている」と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 
01無限リストを作成します。
+0

良いもの;私は精巧に感謝する –