web-dev-qa-db-fra.com

Comment choisir un élément aléatoire 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?

45
sam
import Java.util.Random
// ...
val Rand = new Random(System.currentTimeMillis())
val random_index = Rand.nextInt(A.length)
val result = A(random_index)
32
topless
import scala.util.Random

val A = Array("please", "help", "me")
Random.shuffle(A.toList).head
89
user1338062
import scala.util.Random

val A = List(1, 2, 3, 4, 5, 6)
A(Random.nextInt(A.size))
36
ahogue

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.

Transparence de référence FTW\o /

def getRandElemO[T](arr: Array[T]): Option[T] =
  if (arr.isEmpty) None
  else arr lift util.Random.nextInt(arr.length)
0
Raphael Bobillot

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 

0
Josh Weinstein