制作一组随机整数Scala

时间:2017-09-08 00:23:20

标签: scala random

在Scala中有没有办法让一组Int随机而不重复?

例如,我默认将Int设置为零; A,B,C,d,E。我想从1-100为每个分配一个随机int,而从不为任何变量分配相同的数字。感谢。

2 个答案:

答案 0 :(得分:2)

我可以看到两种方法可以做到这一点。

首先是最简单的一个。如果范围(1-100)足够小,您只需生成此范围内的每个值,随机播放并先取m

import scala.util.Random

Random.shuffle(0 until 100 toList).take(4)

结果:

res0: List[Int] = List(54, 11, 35, 15)

但是如果范围很大,这将不会非常有效(因为范围必须在内存中实现)。因此,当拾取值(m)的数量远小于范围(n)时,生成随机值会更有效,直到您选择一个不是&#39的值。 ;之前用过的。

以下是:

import scala.util.Random

def distinctRandomMOutOfN(m:Int, n:Int):Set[Int] = {
  require(m <= n)
  Stream.continually(Random.nextInt(n)).scanLeft(Set[Int]()) {
    (accum, el) => accum + el
  }.dropWhile(_.size < m).head
}

distinctRandomMOutOfN(4, 100)

结果:

res1: Set[Int] = Set(99, 28, 82, 87)

第二种方法的缺点是如果m接近n,则需要接近O(m²)的平均时间来计算。

<强> UPD 即可。

因此,如果您想要一个在任何情况下都能有效工作的通用解决方案,您可以使用混合变体。如果mn处于同一数量级(即m * 2 >= n),则使用第一种方法,否则使用第二种方法。 此实现将使用O(m)内存,平均运行时间为O(m)

答案 1 :(得分:1)

如果只是简单地将所有可能的元素洗牌然后拿走你需要的东西,你就可以确信没有重复。

import scala.util.Random

Random.shuffle(1 to 100).take(5)  // res0: Vector(74, 82, 68, 24, 15)