Par exemple, il existe un tableau Scala val A = Array("please", "help", "me")
. Comment choisir un élément aléatoire de ce tableau?
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 souhaitez 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 certain que l’option contient une valeur, vous pouvez utiliser la méthode get
.
randomElement.get // This will return a String (or a NotSuchElementExeption)
Néanmoins, la correspondance de modèle ou getOrElse
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.
Remarque que la méthode randomChoice
suppose la substitution d'éléments.
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.
def getRandElemO[T](arr: Array[T]): Option[T] =
if (arr.isEmpty) None
else arr lift util.Random.nextInt(arr.length)
Voici une meilleure réponse qui n’implique pas de remaniement du tableau:
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