如何从Scala中的Set获取随机元素

elm*_*elm 20 random collections scala set scala-collections

例如,对于任何给定的集合,

val fruits = Set("apple", "grape", "pear", "banana")
Run Code Online (Sandbox Code Playgroud)

如何从中获取随机元素fruits

非常感谢.

Gov*_*ngh 20

转换成Vector并从中获取随机元素

scala> val fruits = Set("apple", "grape", "pear", "banana")
fruits: scala.collection.immutable.Set[String] = Set(apple, grape, pear, banana)

scala> import scala.util.Random
import scala.util.Random

scala> val rnd=new Random
rnd: scala.util.Random = scala.util.Random@31a9253

scala> fruits.toVector(rnd.nextInt(fruits.size))
res8: String = apple
Run Code Online (Sandbox Code Playgroud)

  • @TimBarrass`sextInt()`将返回负数的一半时间,但是这里使用的`nextInt(n:Int)`从0开始并以`n`结尾(独占):https:// www .scala-lang.org/API /电流/阶/ util的/ Random.html#nextInt(N:智力)的:int (2认同)

Rok*_*alj 18

因此,之前发布的每个答案在空间方面都有复杂度O(n),因为它们以某种方式创建了整个集合的副本.这是一个没有任何额外复制的解决方案(因此它是"恒定空间"):

def random[T](s: Set[T]): T = {
  val n = util.Random.nextInt(s.size)
  s.iterator.drop(n).next
}
Run Code Online (Sandbox Code Playgroud)

  • @justinhj:不,你的解决方案再次是O(n)空间,因为`Set`上的`drop`会导致创建剩余元素的集合.你*有*使用迭代器,因为它们是非严格的. (7认同)