一個快速且有希望的簡單問題:如何在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)]
,但希望有更簡單的事情。
一個快速且有希望的簡單問題:如何在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)]
,但希望有更簡單的事情。
像往常一樣,Christoph's answer是正確的(他知道Perl 6的好)。不過,我想我會詳細說明一下,因爲pick
和roll
起初很容易混淆。
如果你只想要一個隨機密鑰,然後pick
和roll
似乎相同的,可以互換使用:
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
好東西;我讚賞這種闡述 –
我最終鵝卵石 '%a.keys [INT(%a.elems.rand)一起' 但八九不離十希望簡單,我猜。 –