2012-04-25 66 views

回答

22

爲了生成具有隨機數的1000-元件列表1和10之間:

[rand:uniform(10) || _ <- lists:seq(1, 1000)]. 

變化在10和1000到適當的數字。如果您從rand:uniform調用中省略了10個,則會得到0.0到1.0之間的隨機浮點數。

在二郎版本低於18.0:使用random模塊來代替。 注意!在每個進程使用它之前,您需要運行random:seed/3,以避免獲得相同的僞隨機數。

+4

這是一個隨機做的好主意:seed(now())。在此之前 – fycth 2013-04-25 05:13:24

+0

您將**不**從當前時間播種的僞隨機數生成器中獲得「真隨機數」。它們不會被加密保護。你的意思是每個進程都應該使用自己的種子,所以他們不會得到相同的僞隨機數。 – 2016-07-16 09:56:42

+0

@FilipHaglund謝謝,糾正。 – 2016-07-18 07:11:12

13

確保種子適當。

> F = fun() -> io:format("~p~n", [[random:uniform(10) || _ <- lists:seq(1, 10)]]) end. 
> spawn(F). 
[1,5,8,10,6,4,6,10,7,5] 
> spawn(F). 
[1,5,8,10,6,4,6,10,7,5] 

你的直覺是結果會有所不同。 Erlang中的隨機種子是特定於流程的。默認種子是固定的。這就是爲什麼你會得到同樣的結果,即使在這個例子中有兩個進程。

> G = fun() -> {A1,A2,A3} = now(), 
       random:seed(A1, A2, A3), 
       io:format("~p~n", [[random:uniform(10) || _ <- lists:seq(1, 10)]]) 
     end. 
> spawn(G). 
[3,1,10,7,9,4,9,2,8,3] 
> spawn(G). 
[9,1,4,7,8,8,8,3,5,6] 

注意的是,如果now()返回值是在兩個不同的過程一樣,你如上面結了同樣的問題。這就是爲什麼有些人喜歡使用gen_server來包裝隨機數的生成。或者,你可以使用更好的種子。

+4

'now()'保證永遠不會在同一個節點中給出兩次相同的結果。 – 2012-04-25 17:25:55

+4

'crypto'模塊中還有其他更強大的隨機數生成器(參見[http://www.erlang.org/doc/man/crypto.html](http://www.erlang.org/doc/man/) crypto.html)) – Tilman 2012-04-28 01:40:31

2

我會更高興得到一個網站,我將能夠 在那裏讀它。謝謝。

你應該檢查出Learn You Some Erlang這將引導你通過語言。從密碼模塊

2

僞隨機數發生器工作得更好crypto:rand_uniform(From, To)
爲了生成在1和10之間與隨機數的1000-元件列表:

crypto:start(), 
[crypto:rand_uniform(1, 10) || _ <- lists:seq(1, 1000)].