在Scala中有没有办法让一组Int随机而不重复?
例如,我默认将Int设置为零; A,B,C,d,E。我想从1-100为每个分配一个随机int,而从不为任何变量分配相同的数字。感谢。
答案 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 即可。
因此,如果您想要一个在任何情况下都能有效工作的通用解决方案,您可以使用混合变体。如果m
与n
处于同一数量级(即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)