Come sempre, Christoph's answer è corretta (che conosce bene Perl 6). Tuttavia, ho pensato che avrei elaborato un po 'dal pick
e roll
può essere facilmente confuso in un primo momento.
Se desideri solo una chiave casuale, quindi pick
e roll
sembrano identici e possono essere usati in modo intercambiabile:
my $rand-keyA = %a.keys.pick;
my $rand-keyB = %a.keys.roll;
Tuttavia, pensare a pick
come "ho N le cose e le sto prelevando da un contenitore e una volta che se ne sono andati, se ne sono andati (per questo prelievo) "contro roll
come "Ho un dado N che sto arrotolando".
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(*)
è un modo semplice per creare una lista ordine casuale da un array senza dover conoscere quanti elementi ha:
my @array = <foo bar baz foobar>;
@array.pick(*); # (bar foobar baz foo)
roll(*)
è un modo semplice per creare una lista infinita i cui elementi sono stati scelti casualmente dall'array originale:
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
fonte
2016-02-02 13:39:43
alla fine ho messo insieme '% a.keys [Int (% a.elems.rand)]' ma era sorta sperando in più semplice, immagino. –