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)