2016-01-30 9 views
5

Una domanda rapida e si spera facile:Come posso ottenere una chiave hash selezionata in modo casuale in Perl 6?

Ho bisogno dei mezzi per selezionare casualmente tra un determinato set di chiavi di hash. La documentazione di perl6.org su né rand né su Hash offre molti suggerimenti.

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

luce di quanto sopra,

%a.keys; 

rendimenti (5 1 3) e se ho semplicemente provo

%a.rand; 

ottengo un galleggiante pseudo piuttosto che una chiave.

Alla fine ho acciottolato insieme %a.keys[Int(%a.elems.rand)], ma speravo in qualcosa di più semplice.

+0

alla fine ho messo insieme '% a.keys [Int (% a.elems.rand)]' ma era sorta sperando in più semplice, immagino. –

risposta

9

Usa pick o roll, ad esempio

%a.keys.pick 
+5

Una nota su qualcosa che mi ha fatto inciampare con pick(): se vuoi scegliere più elementi da una lista, non ripetendo, chiama una volta il numero desiderato. Ogni volta che lo chiami, ricomincia con l'elenco completo e puoi ripetere di nuovo gli elementi. In altre parole, per pescare 5 carte da un mazzo, fai questo: my @hand = @ deck.pick (5); Not: my $ card1 = @ deck.pick; my $ card2 = @deck.scegliere; # ecc. –

+0

o anche: '% a.pick.key' –

6

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 rollsembrano 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 
+0

Buona roba; Apprezzo l'elaborazione –

Problemi correlati