2016-01-30 40 views
5

Szybkie i miejmy nadzieję, łatwe pytanie:Jak uzyskać losowo wybrany klucz skrótu w Perlu 6?

Potrzebuję środków, aby wybrać losowo spośród danego zestawu kluczy hash. Dokumentacja perl6.org na temat rand ani Hash oferuje wiele wskazówek.

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

Biorąc powyższe pod uwagę,

%a.keys; 

(5 1 3) powraca i jeśli po prostu spróbować

%a.rand; 

dostaję pseudolosowego pływaka zamiast któregokolwiek klawisza.

Ostatecznie wybrudziłem razem %a.keys[Int(%a.elems.rand)], ale liczyłem na coś prostszego.

+0

ostatecznie sklecony '% a.keys [Int (% a.elems.rand)]' Ale było coś w nadziei na prostsze, tak myślę. –

Odpowiedz

9

Zastosowanie pick lub roll np

%a.keys.pick 
+5

Jedna uwaga na czymś, co mnie zaskoczyło pick(): jeśli chcesz wybrać wiele elementów z listy, nie powtarzaj, wybierz jeden raz i wybierz numer, który chcesz. Za każdym razem, gdy go wywołasz, zaczyna się od pełnej listy i może powtórzyć elementy ponownie. Innymi słowy, aby narysować 5 kart z talii, wykonaj następujące czynności: my @hand = @ deck.pick (5); Nie: my $ card1 = @ deck.pick; my $ card2 = @deck.wybierać; # itp. –

+0

lub też: '% a.pick.key' –

6

Jak zawsze, Christoph's answer jest prawidłowe (wie Perl 6 dobrze). Pomyślałem jednak, że trochę się rozwiną, ponieważ pick i roll można łatwo pomylić na początku.


Jeśli chcesz tylko jeden klucz losowy, a następnie pick i rollwydają identyczne i mogą być stosowane zamiennie:

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

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

jednak myśleć pick jak „Mam N rzeczy i wybieram je z pojemnika, a kiedy już ich nie ma, już ich nie ma (do tego pobrania) "kontra roll jako "Mam kości, które toczę".

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(*) jest łatwym sposobem utworzenia losowej listy zamówień z tablicy bez konieczności wiedzieć, ile elementów ma:

my @array = <foo bar baz foobar>; 

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

roll(*) jest łatwym sposobem utwórz nieskończoną listę, której elementy zostały wybrane losowo z oryginalnej tablicy:

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

Dobre rzeczy; Doceniam to opracowanie –