2012-02-01 105 views
45

这可能是史上最不重要的问题,但它困扰着我。我将如何生成一个n个随机数的列表。我到目前为止:如何生成随机数列表?

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

哪些工作,但看起来不太Scalarific给我。我接受建议。

编辑

不是因为它的相关的这么多,因为它是有趣和明显回想起来,下面看起来像它的工作原理:

1 to 20 map r.nextInt 

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

+3

你应该做的第一件事是让'r'一个'val'而不是'var'。 – Jesper 2012-02-01 11:16:59

+0

@Jesper - 谢谢。 – Malvolio 2012-02-01 11:24:12

+0

@Jesper - 五年后,我终于做我应该做的第一件事...... – Malvolio 2017-07-19 18:36:21

回答

80

您可以使用Don's solution或:

Seq.fill(n)(Random.nextInt) 

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

+0

我需要为'nextInt'函数提供一个最大值。令人惊讶的是(至少对我来说)这个工作:'Seq.fill(6)(Random.nextInt(100))' – Malvolio 2012-02-01 23:47:50

+0

这并不奇怪,请参阅Random companion对象:http://www.scala-lang.org/api /current/index.html#scala.util.Random – Nicolas 2012-02-02 07:16:40

+0

我的意思,我很惊讶,它是'Random.nextInt(100)'被解释为*匿名函数*我想这是和不是int值表示我认为它看起来像。 – Malvolio 2012-02-02 08:51:42

29

如何:

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

也许这是有目共睹的其他人,但我需要做的'VAL R =新util.Random; Stream.continually(r.nextInt).take(10)'让代码工作。 – pr1001 2012-02-01 11:21:56

+0

我把它写成Stream.continually(r.nextInt(100))。take(10).toList' - '.toList'可能是不必要的,但'r.'不是。 – Malvolio 2012-02-01 11:23:07

+0

对不起,我曾导入util.Random.nextInt作为@Nicholas猜测。对于更多的实用工具,你可以在Stream中创建一个val。(nextInt(100))。 – 2012-02-01 11:47:54

4

关于你的编辑,

nextInt可以采取Int参数作为上限随机数,所以1 to 20 map r.nextInt是一样的1 to 20 map (i => r.nextInt(i)),而不是更有益的编译错误。

1 to 20 map (_ => r.nextInt(100))做你的原意。但最好使用Seq.fill,因为它更准确地表示你在做什么。