Per gli array:
import scala.util.Random
import scala.reflect.ClassTag
def takeSample[T:ClassTag](a:Array[T],n:Int,seed:Long) = {
val rnd = new Random(seed)
Array.fill(n)(a(rnd.nextInt(a.size)))
}
Fai un generatore di numeri casuali (rnd
) in base al seme. Quindi, riempire una matrice con numeri casuali da 0 fino alla dimensione della matrice.
L'ultimo passaggio consiste nell'applicare ogni valore casuale all'operatore di indicizzazione dell'array di input. Usandolo in REPL potrebbe apparire come segue:
scala> val myArray = Array(1,3,5,7,8,9,10)
myArray: Array[Int] = Array(1, 3, 5, 7, 8, 9, 10)
scala> takeSample(myArray,20,System.currentTimeMillis)
res0: scala.collection.mutable.ArraySeq[Int] = ArraySeq(7, 8, 7, 3, 8, 3, 9, 1, 7, 10, 7, 10,
1, 1, 3, 1, 7, 1, 3, 7)
Per le liste, vorrei semplicemente convertire la lista di array e utilizzare la stessa funzione. Dubito che puoi ottenere molto più efficiente per le liste comunque.
E 'importante notare che la stessa funzione utilizzando gli elenchi prenderebbe O (n^2) tempo, mentre convertendo la lista agli array prima avrà O (n)
generatori di numeri casuali sono stateful, quindi non ha senso per gli elenchi di avere tale una funzione. Dovresti implementarne uno tu stesso (anche, sarebbe un'operazione lineare). Per gli array, è possibile ottenere un numero intero casuale dagli oggetti "Casuali" in questo modo: "Random.nextInt (myArray.length)" e indicizzare nell'array. – Felix
Ahh, nvm. Ho letto troppo velocemente xD – Felix
Grazie Felix per il tuo aiuto. – Carter