2016-01-30 2 views
5

Eine schnelle und hoffentlich einfache Frage:Wie bekomme ich einen zufällig ausgewählten Hash-Schlüssel in Perl 6?

Ich brauche die Mittel, um aus einer bestimmten Gruppe von Hash-Schlüssel zufällig auszuwählen. Die perl6.org-Dokumentation zu weder rand noch Hash bietet viele Hinweise.

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

die oben gegeben,

%a.keys; 

kehrt (5 1 3) und wenn ich einfach

%a.rand; 

versuche ich, einen Pseudo-Zufalls-Schwimmer anstatt jede einen Schlüssel bekommen.

Ich schob schließlich %a.keys[Int(%a.elems.rand)] zusammen, aber ich hoffte auf etwas einfacheres.

+0

ich schließlich zusammen gepflasterten '% a.keys [Int (% a.elems.rand)]' Aber war sorta für einfachere der Hoffnung, denke ich. –

Antwort

9

Verwenden pick oder roll, zB

%a.keys.pick 
+5

Ein Hinweis auf etwas, das mich mit Pick() stolperte: Wenn Sie mehrere Elemente aus einer Liste auswählen möchten, ohne sich zu wiederholen, wählen Sie einmal mit der gewünschten Nummer. Jedes Mal, wenn Sie es aufrufen, beginnt es mit der vollständigen Liste und könnte Elemente erneut wiederholen. Mit anderen Worten, um 5 Karten aus einem Stapel zu ziehen, mache das: my @hand = @ deck.pick (5); Nicht: my $ card1 = @ deck.pick; mein $ card2 = @deck.wählen Sie aus; # etc. –

+0

oder auch: '% a.pick.key' –

6

Wie immer Christoph's answer korrekt ist (er weiß, Perl 6 gut). Allerdings dachte ich, ich würde ein wenig nacharbeiten, da pick und roll auf den ersten Blick leicht verwechselt werden können.


Wenn Sie nur einen zufälligen Schlüssel möchten, dann pick und rollscheinen identisch und austauschbar verwendet werden:

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

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

aber denken Sie an pick wie „Ich habe N Dinge und ich hole sie aus einem Container und sobald sie weg sind, sind sie weg (für diese Kommissionierung) "gegen roll als "Ich habe einen N -sided Würfel, den ich rolle".

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(*) ist eine einfache Möglichkeit, eine zufällige Reihenfolge Liste aus einem Array zu erstellen, ohne wissen zu müssen, wie viele Elemente hat:

my @array = <foo bar baz foobar>; 

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

roll(*) ist eine einfache Möglichkeit, Erstellen Sie eine unendliche Liste, deren Elemente zufällig aus dem ursprünglichen Array ausgewählt wurden:

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

Gute Sachen; Ich schätze die Ausarbeitung –

Verwandte Themen