Вот рекурсивный подход:
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, это может занять много времени, поэтому может быть лучше добавить другую переменную, чтобы отслеживать количество попыток, чтобы получить последовательность требуемой длины.