然后,我想用这个随机的双列表创建一个固定数量的List[ListDouble] (可以是任何数量,我们现在假设是3)。我读了随机文档,但它仍然让我很困惑。这是我目前所拥有的:
val length: Int = 20
val doubles: List[Double] = List()
val listOf: List[List[Double]] = List(List())
val rand = new Random()实际上,假设我生成了一个包含20个元素的列表,这些元素的随机双精度值从-50到50不等。然后,我想生成一个随机数量的列表,其中包括随机的doubles列表。例如:
val doubles: List[Double] = List(-29.3,46.8,-17.0,9.2,1.4) // in this case, doubles has a length of 5)
val listOf: List[List[Double]] = List(List(-29.3,46.8,-17.0,9.2,1.4),List(-5.0,3.4,31.5,29.0,-41.3)) // in this case, the inner lists have a length of 5, and the fixed number is
//2 because listOf has a length of 2我也希望在没有可变性的情况下处理这个问题。如何使用上面的规范生成一个随机的doubles列表,然后生成一个随机列表列表?
发布于 2020-10-13 09:33:24
直接的答案很简单:
import scala.util.Random
List.fill(3)(List.fill(20)(Random.between(-50.0, 50.0)))重复任何随机Double的可能性非常小,但如果您绝对必须保证唯一性,没有突变,那么这里有一个相当低效的解决方案。
import scala.util.Random
def isDistinct(lld: List[List[Double]]):Boolean =
lld.flatten.foldLeft((true, Set.empty[Double])){
case ((res, seen), dbl) => (res && !seen(dbl), seen+dbl)
}._1
LazyList.continually {
val llr = List.fill(3)(List.fill(20)(Random.between(-50.0, 50.0)))
Option.when(isDistinct(llr))(llr)
}.flatten.head同样值得注意的是:between()在底部是包含的(因此-50.0不太可能,但可能),而在顶部是独占的(所以确切地说50.0不应该是可能的)。
Scala2.12.x翻译
def isDistinct(. . . //same
val rng = new scala.util.Random
Stream.continually {
val llr = List.fill(3)(List.fill(20)(rng.nextDouble * 100 - 50))
if (isDistinct(llr)) Some(llr) else None
}.flatten.headhttps://stackoverflow.com/questions/64326920
复制相似问题