2016-08-13 2 views
1

Betrachten funktioniert die folgenden Arrays und Bereich:Warum Rand innerhalb einer jeder Schleife in eine andere jede Schleife verschachtelt nicht

friends = ["Joe", "Sam", "Tom"] 
ary = [rand(1..5), rand(6..10), rand(11..20)] 
range = (0..2) 

Ich möchte einen Code erzeugen, die für Joe etwas zurück, wie folgt:

"Joe at the end of year 1 wrote 2 essays" 
"Joe at the end of year 2 wrote 8 essays" 
"Joe at the end of year 3 wrote 16 essays" 

und für Sam und Tom eine andere Anzahl von Aufsätzen jedes Jahr.
Es ist möglich, den folgenden Code zu verwenden:

friends.each do |friend| 
    "#{friend} at the end of year 1 wrote #{rand(1..5)} essays" 
    "#{friend} at the end of year 2 wrote #{rand(6..10)} essays" 
    "#{friend} at the end of year 3 wrote #{rand(11..20)} essays" 
end 

aber dieser Code ist repetitiv und redundant, nicht bedenkt, dass die Größe von ary als hier größer sein kann. Also dachte ich, den folgenden kompakten Code zu verwenden:

friends.each do |friend| 
    range.each do |num| 
    "#{friend} at the end of year #{num+1} wrote #{ary[num]} essays" 
    end 
end 

Aber dieser Code würde für jeden Freund die gleiche Anzahl von Essays zurückkehren, so dass die Verwendung von Verfahren rand nutzlos wäre. Warum das? Welche Lösung würden Sie vorschlagen?

Antwort

2

Haben Sie darüber nachgedacht, die Bereiche in einem Array zu speichern und bei Bedarf von rand zu zeichnen?

friends = ["Joe", "Sam", "Tom"] 
ary =[(1..5), (6..10), (11..20)] 
year = (1..3) 
friends.each do |friend| 
    year.each do |yr| 
    p "#{friend} at the end of year #{yr} wrote #{rand(ary[yr - 1])} essays" 
    end 
end 

Dies erzeugt, zum Beispiel:

"Joe at the end of year 1 wrote 5 essays" 
"Joe at the end of year 2 wrote 7 essays" 
"Joe at the end of year 3 wrote 16 essays" 
"Sam at the end of year 1 wrote 3 essays" 
"Sam at the end of year 2 wrote 7 essays" 
"Sam at the end of year 3 wrote 18 essays" 
"Tom at the end of year 1 wrote 2 essays" 
"Tom at the end of year 2 wrote 8 essays" 
"Tom at the end of year 3 wrote 15 essays" 
+0

Jede Schleife (oder welche alternative Lösung) sollte auf jedem Element von ary, von Anfang bis Ende, ohne Wiederholung iterieren. Die Reihenfolge der Elemente sollte respektiert werden, so dass es einen Verlauf der schriftlichen Aufsätze von Jahr 1 bis Jahr 3 gibt. – Asarluhi

+1

@Asarluhi hast du versucht, die gelieferte Lösung auszuführen? Ich habe den gleichen Fortschritt respektiert, den Sie in Ihrer Frage gegeben haben. – pjs

+0

Sie haben Recht, ich habe nicht bemerkt, dass Sie rand von ary entfernen. Vielen Dank @pjs, es funktioniert! – Asarluhi

2

Neben @pjs Sie each_with_index Methode können

friends = ["Joe", "Sam", "Tom"] 
ary =[(1..5), (6..10), (11..20)] 
friends.each do |friend| 
    ary.each_with_index do |value, year| 
    p "#{friend} at the end of year #{year+1} wrote #{rand(value)} essays" 
    end 
end 

Auch Antwort auf Ihre Frage:“.. so dass die Verwendung der Methode rand wäre sinnlos. "- Wenn Sie ein Array erstellen, dessen Elemente - die Methoden - das Ergebnis ihrer Arbeit in diesem Array zurückgeben, können Sie das nächste Mal in Ihrer Konsole mitversuchen:

2.3.0 :001 > ary = [rand(1..5), rand(6..10), rand(11..20)] 
=> [2, 9, 12] 
Verwandte Themen