【问题标题】:How to generate a list of random numbers?如何生成随机数列表?
【发布时间】:2012-02-01 11:12:30
【问题描述】:

这可能是有史以来最不重要的 Scala 问题,但它困扰着我。我将如何生成一个包含 n 个随机数的列表。到目前为止我所拥有的:

def n_rands(n : Int) = {
 val r = new scala.util.Random
 1 to n map { _ => r.nextInt(100) } 
}

这可行,但对我来说看起来不是很标量。我愿意接受建议。

编辑

回想起来,并不是因为它的相关性如此之大,而是因为它很有趣且显而易见,所以以下看起来很有效:

1 to 20 map r.nextInt

但是返回列表中每个条目的索引也是最后一个的上限。第一个数字必须小于 1,第二个数字必须小于 2,依此类推。我跑了三四次,发现“嗯,结果总是以 0 开头……”

【问题讨论】:

  • @Jesper -- 五年后,我终于做了我应该做的第一件事......

标签: scala


【解决方案1】:

您可以使用Don's solution 或:

Seq.fill(n)(Random.nextInt)

注意,不需要创建新的Random对象,可以使用默认的伴生对象Random,如上所述。

【讨论】:

  • 我需要为nextInt 函数提供一个最大值。令人惊讶的是(至少对我来说)这有效:Seq.fill(6)(Random.nextInt(100))
  • 这并不奇怪,请参阅随机伴随对象:scala-lang.org/api/current/index.html#scala.util.Random
  • 我的意思是,我很惊讶 Random.nextInt(100) 被解释为 匿名函数 我希望它是而不是 int 值表达我认为它看起来像.
  • 这是因为填充函数的第二个参数是“按名称”传递的(它的类型是=> E):Random.nextInt(100)为每个创建的值计算。
  • Seq.fill(5)(util.Random.nextInt)
【解决方案2】:

怎么样:

import util.Random.nextInt
Stream.continually(nextInt(100)).take(10)

【讨论】:

  • 也许这对其他人来说是显而易见的,但我需要执行val r = new util.Random; Stream.continually(r.nextInt).take(10) 才能使代码正常工作。
  • 我把它写成Stream.continually(r.nextInt(100)).take(10).toList -- .toList 可能是不必要的,但r. 不是。
  • 对不起,我已经导入了 util.Random.nextInt 正如@Nicholas 猜测的那样。对于更多实用程序,您可以从 Stream.continually(nextInt(100)) 中创建一个 val。
  • 这对我非常有用,因为我可以在 take(n) 之前通过 Stream.distinct 对其进行过滤以获得唯一的采样,这正是我所需要的。
【解决方案3】:

关于您的编辑,

nextInt 可以将Int 参数作为随机数的上限,因此1 to 20 map r.nextInt1 to 20 map (i => r.nextInt(i)) 相同,而不是更有用的编译错误。

1 to 20 map (_ => r.nextInt(100)) 做你想做的事。但最好使用Seq.fill,因为它更准确地代表了您正在做的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    相关资源
    最近更新 更多