Comment choisir un élément aléatoire à partir d'un tableau dans Scala?
Par exemple, il existe un tableau Scala val A = Array("please", "help", "me"). Comment choisir un élément aléatoire de ce tableau?
6 réponses
import java.util.Random
// ...
val rand = new Random(System.currentTimeMillis())
val random_index = rand.nextInt(A.length)
val result = A(random_index)
import scala.util.Random
val A = Array("please", "help", "me")
Random.shuffle(A.toList).head
import scala.util.Random
val A = List(1, 2, 3, 4, 5, 6)
A(Random.nextInt(A.size))
Si vous voulez une solution plus idiomatique, envisagez d'utiliser le modèle typeclass (classes implicites dans scala).
implicit class ListOps[A](list: List[A]) {
def getRandomElement: Option[A] = list match {
case Nil => None
case _ => list.lift(scala.util.Random.nextInt(list.size))
}
def randomChoice(n: Int): Option[List[A]] =
(1 to n).toList.foldLeft(Option(List[A]()))((acc, e) => getRandomElement.flatMap(r => acc.map(a => a :+ r)))
}
Maintenant, si la classe implicite est dans la portée, vous pouvez:
val randomElement: Option[String] = List("this", "is", "a", "list").getRandomElement
Si vous êtes sûr que l'option contient une certaine valeur, vous pouvez utiliser le get méthode.
randomElement.get // This will return a String (or a NotSuchElementExeption)
Néanmoins, la correspondance de motif ou {[5] } est recommandée:
randomElement match {
case None => ??? // This is what you do when a None is encounter (e.g. for empty lists)
case Some(result) => ??? // The variable result contains a string.
Notez {[17] } que la méthode randomChoice suppose la substitution d'éléments.
Une meilleure réponse qui n'implique pas de remaniement du tableau serait la suivante:
import scala.util.Random
object sample {
//gets random element from array
def arr[T](items:Array[T]):T = {
items(Random.nextInt(items.length))
}
}
Cela fonctionne aussi génériquement
Nous pouvons également ajouter un peu de sécurité avec la monade Option (en utilisant la fonction lift, et une condition)
En fait, si vous utilisez cette fonction sur des tableaux (qui pourraient être vides), votre résultat sera toujours une Option.
Transparence référentielle FTW \ o /
def getRandElemO[T](arr: Array[T]): Option[T] =
if (arr.isEmpty) None
else arr lift util.Random.nextInt(arr.length)