2016-09-21 5 views
0

Wie würde ich in Ruby ein zufälliges Element aus einem Array auswählen und mit einem zufällig ausgewählten Element aus einem zweiten Array kombinieren?Zufallselemente mehrerer Arrays kombinieren

Zum Beispiel, wenn ich die Arrays:

array1 = ["x", "y", "z"] 
    array2 = ["a", "b", "c"] 

Ich bin für die Ausgabe der Suche nach seinem (array1_element) (array2_element) (array1_element) wie xby oder YCZ oder xbx so weiter und so weiter. Kann die Ruby-Methode ".sample" für mehrere Arrays verwendet werden, um eine einzelne Zeichenfolge auszugeben?

+2

'" # {array1.sample} # {array2.sample} # {array1.sample} "' – Aetherus

+0

Wie können Sie "ein zufälliges Element aus einem Array auswählen und mit einem zufällig ausgewählten Element aus einem zweiten Array kombinieren, um" xby "zu erzeugen? Wollen Sie sagen, dass Sie ein Element aus dem ersten Array zufällig auswählen möchten, dann ein Element aus dem zweiten Array zufällig auswählen und dann ein drittes Element aus dem ersten Array zufällig auswählen? –

+0

Wenn Sie wiederholt Sampling durchführen, können Sie ein Array aller ('3^3 = 27') Kombinationen erstellen und dann davon abtasten:' arr = array1.product (array2, array1) .map (&: join) # => ["xax", "xay", "xaz", "xbx", "xby", "xbz", "xcx", "xcy", "xcz", "yax", "yay", "yaz", " "ybx", "yby", "ybz", "ycx", "ycy", "ycz", "zax", "zay", "zaz", "zbx", "zby", "zbz", "zcx" , "zcy", "zcz"]; arr.beispiel # => => "zcx"; arr.sample # => "yay" '. –

Antwort

1

Es gibt einige Möglichkeiten, dies zu tun.

1) Sie können sample Methode verwenden.

array1.sample #=> return a random element from the array. 

Dann können Sie String-Interpolation wie

result = "#{array1.sample}#{array2.sample}#{array3.sample}" #=> ie "xby" 

2) Sie verwenden generieren Zufallsindexwerte

array1[rand(array1.length)] 

Dies wird einen zufälligen Index 0-length-1 und Anruf erzeugen die [] Methode auf dem Array. Sie können dann auch die String-Interpolation verwenden.

3) Sie die shuffle Methode first dann Methode

array1.shuffle.first 

shuffle verwenden können, na ja, das Array mischen, und man kann nur das erste Element zurück.

Ich liste nur die wenigen auf, die ich mir von Kopf bis Kopf einfallen lassen kann. Es gibt wahrscheinlich Tonnen anderer Möglichkeiten, dies zu tun.

1

Wie wäre es

(array1 + array2).sample(3) # => ["b", "x", "a"] 

, wenn Sie Ihre Antwort in Array-Form wünschen, oder

(array1 + array2).sample(3).join('') # => "zxb" 

, wenn Sie es in Form einer Zeichenfolge wollen?

Wenn der Auftrag soll ausdrücklich [array1_elt, array2_elt, array1_elt] sein und Sie nicht möchten, dass jedes Element wiederholt, dann folgendes sollte es tun:

array1.sample(2).insert(1, array2.sample) 

Wieder anhängen .join('') das Ergebnis an stringify.

+0

das wird nicht die ganze Zeit funktionieren. OP wollte eine bestimmte Reihenfolge '(array1) (array2) (array1)'. Ihre Methode wird nur zufällige 3 Elemente aus dem kombinierten Array zurückgeben, so dass Sie in 'bzx' resultieren können, was die falsche Reihenfolge ist. – davidhu2000

+0

Es war nicht klar, dass OP immer eine bestimmte Reihenfolge wollte, es kam als eine "Instanz" ... – pjs

0

Ich nehme an, Sie wollen [a,b,c] ein Array bilden, wo a und c werden zufällig aus der ersten Reihe ausgewählt und b zufällig aus der zweiten Reihe ausgewählt wird, und dann die drei Elemente des Arrays in einen String zu verbinden.

Wenn Sie Probenahme wiederholt könnte es sich lohnen, ein Array aller (3^3=27) Kombinationen zu konstruieren und dann von diesem Array probieren:

arr = array1.product(array2, array1).map(&:join) 
    #=> ["xax", "xay", "xaz", "xbx", "xby", "xbz", "xcx", "xcy", "xcz", 
    # "yax", "yay", "yaz", "ybx", "yby", "ybz", "ycx", "ycy", "ycz", 
    # "zax", "zay", "zaz", "zbx", "zby", "zbz", "zcx", "zcy", "zcz"] 

arr.sample #=> "zcx" 
arr.sample #=> "yay" 
arr.sample #=> "ycz" 
arr.sample #=> "xby"