2013-12-16 44 views
0

我需要計算一些類似於[0,1)中的10^8均勻分佈的數字,以進行蒙特卡洛模擬。我可以看到兩種方法來獲得這些 - 一次性計算我需要的所有隨機數,例如通過使用Numpy隨機數字 - 全部在一個去或重複呼叫?

numpy.random.random_sample(however_many_I_need) 

或多次撥打

numpy.random.random_sample() 

有速度或這兩種方法之間的隨機數的質量有什麼區別?

回答

2

10^8是一個很大的數字。正如所有事情numpy一樣,如果您一次預先生成數字,這將會快得多,因爲您避免了python函數調用開銷。這也適用於您可能想要執行的其他操作 - 添加,減法,乘法,除法,求冪,過濾以及許多其他操作。

另一方面,如果您預先生成數字並繼續從python單獨訪問每一個。確保您可以使用矩陣/矢量操作完成模擬。

至於質量,你提到的兩種方法沒有區別。如果你需要密碼安全的隨機數字,你應該檢查@ MayurPatel的答案。這隻有在你需要隨機序列難以猜測的攻擊者時才需要。對於蒙特卡羅模擬,你可能更感興趣的統計健全性和numpy的random已經足夠了

0

你會考慮使用os.urandom()嗎?我相信這是你在python本地獲得的最高質量;但它可能沒有其他方法那麼快。

+0

蒙特卡羅模擬可能不需要加密安全隨機數 – goncalopp

+0

FYI:'timeit.timeit( 「os.urandom(1)」,設置= 「導入OS」,數= int(1E8))'給出135.40s;從'timeit.timeit(「os.urandom(int(1E8))」,setup =「import os」,number = int(1))'0.44s。 – Anne

+0

@安妮我想你發佈了你的評論錯誤的答案 – goncalopp

5

爲什麼不計時和看?

import timeit 
timeit.timeit("np.random.random_sample()", 
       setup="import numpy as np", 
       number=int(1E8)) 

14.27977508635054

timeit.timeit("np.random.random_sample(int(1E8))", 
       setup="import numpy as np", 
       number=1) 

1.4685100695671025

至於質量,無論結果將作爲僞隨機與其他 - 他們來自同一個發電機。如果你需要更安全的東西,它可能值得在其他地方尋找,但如果這是一個簡單的蒙特卡洛問題,我不認爲你真的需要。

PS timeit是偉大