首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成List(List(Doubles))的随机List()

生成List(List(Doubles))的随机List()
EN

Stack Overflow用户
提问于 2020-10-13 08:38:32
回答 1查看 312关注 0票数 0

然后,我想用这个随机的双列表创建一个固定数量的List[ListDouble] (可以是任何数量,我们现在假设是3)。我读了随机文档,但它仍然让我很困惑。这是我目前所拥有的:

代码语言:javascript
复制
 val length: Int = 20
 val doubles: List[Double] = List()
 val listOf: List[List[Double]] = List(List())
 val rand = new Random()

实际上,假设我生成了一个包含20个元素的列表,这些元素的随机双精度值从-50到50不等。然后,我想生成一个随机数量的列表,其中包括随机的doubles列表。例如:

代码语言:javascript
复制
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列表,然后生成一个随机列表列表?

EN

回答 1

Stack Overflow用户

发布于 2020-10-13 09:33:24

直接的答案很简单:

代码语言:javascript
复制
import scala.util.Random

List.fill(3)(List.fill(20)(Random.between(-50.0, 50.0)))

重复任何随机Double的可能性非常小,但如果您绝对必须保证唯一性,没有突变,那么这里有一个相当低效的解决方案。

代码语言:javascript
复制
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翻译

代码语言:javascript
复制
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.head
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64326920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档