2012-02-01 151 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,因爲它更準確地表示你在做什麼。