gpt4 book ai didi

scala - 从 Array 中随机选择 n 个元素

转载 作者:行者123 更新时间:2023-12-03 15:48:10 31 4
gpt4 key购买 nike

我要选择 数组中的唯一元素,其中我的数组大小通常为 1000 的值 3 .我想在迭代算法中实现这个,其中迭代大约是 3000000 我必须在每次迭代中获得 n 个唯一元素。这里有一些我喜欢的可用解决方案,但由于它们的缺点,我无法使用它们,如下所述。

import scala.util.Random
val l = Seq("a", "b", "c", "d", "e")
val ran = l.map(x => (Random.nextFloat(), x)).sortBy(_._1).map(_._2).take(3)
此方法较慢,因为必须创建 数组并对数组进行排序。
 val list = List(1,2,3,4,5,1,2,3,4,5)
val uniq = list.distinct
val shuffled = scala.util.Random.shuffle(uniq)
val sampled = shuffled.take(n)
生成两个数组,混洗大数组是较慢的过程。
 val arr = Array.fill(1000)(math.random )
for (i <- 1 to n; r = (Math.random * xs.size).toInt) yield arr(r)
这是一种更快的技术,但有时会多次返回相同的元素。这是一个输出。
val xs = List(60, 95, 24, 85, 50, 62, 41, 68, 34, 57)
for (i <- 1 to n; r = (Math.random * xs.size).toInt) yield xs(r)

res: scala.collection.immutable.IndexedSeq[Int] = Vector( 24 , 24 , 41)
可以观察到 24 被退回 2 次 .
如何更改最后一种方法以获取唯一元素?是否有其他更优化的方法来执行相同的任务?

最佳答案

您的示例似乎并不相关(字符串?整数?)但也许这样的事情会起作用。

import scala.util.Random.nextInt

val limit = 1000 // 0 to 999 inclusive
val n = 3
Iterator.iterate(Set.fill(n)(nextInt(limit)))(_ + nextInt(limit))
.dropWhile(_.size < n)
.next()
//res0: Set[Int] = Set(255, 426, 965)

关于scala - 从 Array 中随机选择 n 个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63127952/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com