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 roll
wydają 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
ostatecznie sklecony '% a.keys [Int (% a.elems.rand)]' Ale było coś w nadziei na prostsze, tak myślę. –