Scala - заполнить Seq случайными числами, без дубликатов и всегда с одинаковым размером - PullRequest
0 голосов
/ 04 ноября 2019

Я хотел бы создать Seq из Ints с размером, всегда равным 3. Если число находится в диапазоне от 0 до 10, то я хочу всегда возвращать Seq из 3 одинаковых чисел. Если число из другого диапазона, то я хочу вернуть Seq из 3 случайных чисел, но без дубликатов. Я создал код для этого:

object Simulator {
  def toSeq(value: => Int): Seq[Int] = Seq.fill(3)(value)

  def shuffle(): Seq[Int] = {
    val seq = 0 to 100
    val number = Random.nextInt(seq.length)
    number match {
      case _ if 0 to 10 contains number => toSeq(number)
      case _ => toSeq(Random.nextInt(seq.count(_ != number)))
    }
  }
}

Но во втором случае я могу рандомизировать 1, 2 или 3 одинаковых числа, и тогда размер моего Seq равен 1 или 2 (после удаления дубликатов). Как я могу изменить этот код на аналогичный, но всегда возвращать Seq длиной 3?

Ответы [ 2 ]

2 голосов
/ 04 ноября 2019
def shuffle(): Seq[Int] = {
  val nums = util.Random.shuffle(Seq.tabulate(101)(identity))
  if (nums.head < 11) Seq.fill(3)(nums.head)
  else nums.take(3)
}

Примечание: если 1-е число находится вне диапазона от 0 до 10, 2-е и / или 3-е число по-прежнему ограничиваются только диапазоном от 0 до 100.

1 голос
/ 04 ноября 2019

Вот рекурсивный подход:

def threeRands(n : Int, acc : Seq[Int] = Seq()) : Seq[Int] = {
  val num = Random.nextInt(n)
  if(n <= 0) Seq.fill(3)(-1)
  else if(n > 0  && n < 11) {
    Seq.fill(3)(num)
  } else {
    if(acc.size==3) acc
    else if(acc.contains(num)) threeRands(n, acc)
    else threeRands(n, acc :+ num)
  }
}

threeRands(4) //res0: Seq[Int] = List(1, 1, 1)
threeRands(13) //res1: Seq[Int] = List(9, 3, 4)
threeRands(1000) //res2: res2: Seq[Int] = List(799, 227, 668)

Это можно оптимизировать больше, извлекая случай < 11 или используя Set вместо Seq. Обратите внимание, что если размер последовательности был намного больше 3, это может занять много времени, поэтому может быть лучше добавить другую переменную, чтобы отслеживать количество попыток, чтобы получить последовательность требуемой длины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...