我需要計算一些類似於[0,1)中的10^8均勻分佈的數字,以進行蒙特卡洛模擬。我可以看到兩種方法來獲得這些 - 一次性計算我需要的所有隨機數,例如通過使用Numpy隨機數字 - 全部在一個去或重複呼叫?
numpy.random.random_sample(however_many_I_need)
或多次撥打
numpy.random.random_sample()
有速度或這兩種方法之間的隨機數的質量有什麼區別?
我需要計算一些類似於[0,1)中的10^8均勻分佈的數字,以進行蒙特卡洛模擬。我可以看到兩種方法來獲得這些 - 一次性計算我需要的所有隨機數,例如通過使用Numpy隨機數字 - 全部在一個去或重複呼叫?
numpy.random.random_sample(however_many_I_need)
或多次撥打
numpy.random.random_sample()
有速度或這兩種方法之間的隨機數的質量有什麼區別?
10^8是一個很大的數字。正如所有事情numpy一樣,如果您一次預先生成數字,這將會快得多,因爲您避免了python函數調用開銷。這也適用於您可能想要執行的其他操作 - 添加,減法,乘法,除法,求冪,過濾以及許多其他操作。
另一方面,如果您預先生成數字並繼續從python單獨訪問每一個。確保您可以使用矩陣/矢量操作完成模擬。
至於質量,你提到的兩種方法沒有區別。如果你需要密碼安全的隨機數字,你應該檢查@ MayurPatel的答案。這隻有在你需要隨機序列難以猜測的攻擊者時才需要。對於蒙特卡羅模擬,你可能更感興趣的統計健全性和numpy的random
已經足夠了
你會考慮使用os.urandom()嗎?我相信這是你在python本地獲得的最高質量;但它可能沒有其他方法那麼快。
爲什麼不計時和看?
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
是偉大
蒙特卡羅模擬可能不需要加密安全隨機數 – goncalopp
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
@安妮我想你發佈了你的評論錯誤的答案 – goncalopp