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?

44
demandé sur topless 2011-02-19 18:14:08

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)
30
répondu topless 2016-10-28 14:04:47
import scala.util.Random

val A = Array("please", "help", "me")
Random.shuffle(A.toList).head
84
répondu user1338062 2013-02-02 17:04:08
import scala.util.Random

val A = List(1, 2, 3, 4, 5, 6)
A(Random.nextInt(A.size))
36
répondu ahogue 2013-12-30 20:39:35

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.

1
répondu Rodrigo Hernández Mota 2018-06-12 19:04:43

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

0
répondu Josh Weinstein 2017-05-20 23:49:46

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)
0
répondu Raphael Bobillot 2017-09-08 10:14:00