Как выбрать случайный элемент из массива в Scala? - PullRequest
46 голосов
/ 19 февраля 2011

Например, существует массив Scala val A = Array("please", "help", "me").Как выбрать случайный элемент из этого массива?

Ответы [ 6 ]

92 голосов
/ 02 февраля 2013
import scala.util.Random

val A = Array("please", "help", "me")
Random.shuffle(A.toList).head
36 голосов
/ 31 декабря 2013
import scala.util.Random

val A = List(1, 2, 3, 4, 5, 6)
A(Random.nextInt(A.size))
34 голосов
/ 19 февраля 2011
import java.util.Random
// ...
val rand = new Random(System.currentTimeMillis())
val random_index = rand.nextInt(A.length)
val result = A(random_index)
1 голос
/ 12 июня 2018

Если вы хотите более идиоматическое решение, рассмотрите возможность использования шаблона классов типов (неявные классы в 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)))
}

Теперь, если неявный класс находится в области видимости, вы можете:

val randomElement: Option[String] = List("this", "is", "a", "list").getRandomElement

Если вы уверены, что опция содержит какое-то значение, вы можете использовать метод get.

randomElement.get // This will return a String (or a NotSuchElementExeption)

Тем не менее, рекомендуется сопоставление с шаблоном или getOrElse:

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. 

Обратите внимание , что метод randomChoice предполагает замену элементов.

1 голос
/ 08 сентября 2017

Мы также можем добавить некоторую безопасность с помощью монады Option (используя функцию lift и условие)

На самом деле, если вы используете эту функцию для массивов (которые могут быть пустыми), ваш результат всегда будет опцией.

Ссылочная прозрачность FTW \ o /

def getRandElemO[T](arr: Array[T]): Option[T] =
  if (arr.isEmpty) None
  else arr lift util.Random.nextInt(arr.length)
0 голосов
/ 21 мая 2017

Лучший ответ, который вообще не предполагает перестановки массива, будет следующим:

import scala.util.Random

object sample {
  //gets random element from array
  def arr[T](items:Array[T]):T = {
    items(Random.nextInt(items.length))
  }
}

Это также работает в общем

...