Scala/Java:生成一组非重复随机数

Joh*_*van 1 java random scala

我需要从Scala中的列表中随机抽取n个元素的子集,我想知道是否有一种方便的方法可以这样做,而无需手动检查n个元素中的每一个都是唯一的.目前我有这样的事情:

import util.Random

def sample(itms:List[A], sampleSize:Int) {
  var numbersSeen = Set[Int]()
  var sampled = List[A]()
  val itmLen = itms.size()
  var sampleIdex = Random.nextInt(itmLen)
  while(sampled < sampleSize) {
    if(numbersSeen.contains(sampleIdex)){
      sampleIdex = Random.nextInt(itmLen)
    } else {
      numbersSeen.add(sampleIdex)
      sampled.add(itms(sampleIdex))
    }
  }
  sampled
}
Run Code Online (Sandbox Code Playgroud)

我希望有更多的东西优雅可以做要么产生在一个范围内的整数的非重复随机列表或随机样本n从一个列表中的元素.

Kei*_*son 5

如果您的列表不是太长,您可以随机播放索引号列表,然后浏览该列表.

在Scala中会是这样的:

val aList = ('A' to 'Z').toList

val aListIterator = scala.util.Random.shuffle((0 until aList.length).toList).toIterator
Run Code Online (Sandbox Code Playgroud)

然后在你的循环结构中:

...
if( aListIterator.hasNext ) aList(aListIterator.next)
...
Run Code Online (Sandbox Code Playgroud)

如果列表很大,那么返回列表大小(用作索引)范围内的唯一随机数的函数可能是更好的方法.Jeff Preshing最近发表了关于独特随机数的博客,http: //preshing.com/20121224/how-to-generate-a-sequence-of-unique-random-integers .