2016-08-05 32 views
0

Ist es möglich, eine Reihe von Werten mit einer Funktion in Scala rekursiv zu generieren?Werte programmgesteuert erzeugen scala

Etwas wie folgt aus:

def generateVal (nbrOfVal: Int) { 
for (i <- 1 to nbrOfVal) { 
val foo[i] = Seq.fill(6)(nextInt(100))} 
} 

Damit wäre es möglich, die val direkt zu verwenden.

Zum Beispiel generateVal (2) geben würde:

foo1: Seq[Int] = List(52, 83, 33, 85, 36, 39) 
foo2: Seq[Int] = List(84, 47, 53, 66, 13, 72) 

und dann könnten wir tun:

foo1.zipAll(foo2, 0, 0).map { case (a, b) => a + b } 
res: Seq[Int] = List(136, 130, 86, 151, 49, 111) 
+0

Check [diese] (http://stackoverflow.com/questions/9094820/how-to-generate-a-list-of-random-numbers) – Esardes

+0

Nur Neugierig, warum benutzt du 'Seq.fill (6) (nextInt (200))' nicht sofort? Warum Zip- und Summenlisten? –

+0

Ich versuche, eine große Anzahl von Stichproben zu erzeugen, bei denen das Ergebnis des aktuellen Schritts von den Daten im vorherigen Schritt abhängt. Um die Linie zu durchbrechen und einen Stack-Überlauf zu vermeiden, plane ich, jede x-Iteration zu überprüfen, deshalb muss jeder Datensatz iterativ generiert werden, denke ich. – ulrich

Antwort

2

Hier ist ein vollständiges Beispiel können println Anweisungen für das Debuggen verwendet werden (um zu sehen, was geht weiter). Sie verlangsamen im Allgemeinen die Ausführung ...

import scala.util.Random 

object Randoms extends App { 

    def generateVal(numOfLists: Int, numOfElements: Int): Seq[Seq[Int]] = 
    for (i <- 1 to numOfLists) yield { 
     Seq.fill(numOfElements)(Random.nextInt(100)) 
    } 

    val (numOfLists, numOfElements) = (2, 5) 
    val listOfLists = generateVal(numOfLists, numOfElements) 

    // listOfLists foreach println // debug 

    val startingList = Seq.fill(numOfElements)(0) // must have same # of elements, for zipping! 
    val finalList = listOfLists.fold(startingList) { (s1, s2) => 
    //println(s"s1 = $s1") // debug 
    //println(s"s2 = $s2") // debug 
    (s1 zip s2) map { case (a, b) => a + b } 
    } 

    // println(finalList) 
}