python random 和numpy random_Python中numpy.random和random.random之间的区别
我在Python中有一個大腳本。 我在其他人的代碼中得到了啟發,所以最終我在某些方面使用了numpy.random模塊(例如,用于創建從二項式分布中獲取的隨機數數組),而在其他地方,我使用了模塊random.random。
有人可以告訴我兩者之間的主要區別嗎?
看一下這兩個文檔的文檔網頁,在我看來numpy.random只是有更多的方法,但是我不清楚隨機數的生成方式是如何不同的。
我問的原因是因為我需要為調試目的播種我的主程序。 但是,除非我在要導入的所有模塊中都使用相同的隨機數生成器,否則它將無法正常工作嗎?
另外,我在另一篇文章中閱讀了關于不使用numpy.random.seed()的討論,但是我并不真正理解為什么這是一個糟糕的主意。 如果有人向我解釋為什么會這樣,我將不勝感激。
您已經做出了許多正確的觀察!
除非您希望為兩個隨機生成器都作為種子,否則從長遠來看選擇一個或另一個生成器可能更簡單。
對于numpy.random.seed(),主要困難在于它不是線程安全的-也就是說,如果您有許多不同的執行線程,則使用它是不安全的,因為如果兩個不同的線程正在執行該函數,則不能保證它可以正常工作。同時。如果您不使用線程,并且可以合理地期望將來不需要以這種方式重寫程序,則numpy.random.seed()應該沒問題。如果有任何理由懷疑您將來可能需要線程,那么從長遠來看,按照建議進行操作并創建numpy.random.Random類的本地實例會更加安全。據我所知,random.random.seed()是線程安全的(或者至少我沒有發現任何相反的證據)。
numpy.random庫包含一些科學研究中常用的額外概率分布,以及用于生成隨機數據數組的幾個便捷函數。 random.random庫要輕一些,如果您不從事科學研究或其他統計工作,那應該很好。
否則,它們都使用Mersenne扭曲序列生成它們的隨機數,而且它們都是完全確定性的-也就是說,如果您知道一些關鍵信息,則可以絕對確定地預測下一個數字。因此,numpy.random或random.random都不適合任何嚴重的加密用途。但是,由于序列非常長,因此在您不擔心有人試圖對數據進行反向工程的情況下,兩者都適合生成隨機數。這也是必須播種隨機值的原因-如果每次都從同一位置開始,那么您將始終獲得相同的隨機數序列!
附帶說明一下,如果您確實需要加密級別的隨機性,則應該使用secrets模塊,或者如果使用的是Python 3.6之前的Python版本,則應使用Crypto.Random之類的東西。
作為一個遙遠的相關說明,有時有時不需要使用它們,因為梅森捻線器不會產生足以用于加密(和某些非常規的科學)目的的熵的隨機序列。在極少數情況下,您通常需要Crypto.Random,它能夠使用OS特定的熵源來生成質量不確定的隨機序列,其質量要比單獨random.random高。不過,您通常不需要這個。
謝謝Hannnele。您的見解確實非常有用!事實證明,我不能只使用一個隨機數生成器(因為隨機數不會產生二項式分布,所以它必須是numpy),因為我的程序的一部分調用了另一個使用隨機數的程序。我將必須播種這兩個生成器。
"如果知道現在有哪個數字,就可以絕對確定地預測下一個數字。"我認為這句話可能需要澄清。意思是,如果您知道生成器的內部狀態,則可以重現序列-這是在生成生成器時執行的操作。給定生成器輸出的單個數字,您將無法預測下一個數字。周期如此之大,您可能需要很長的數字序列才能計算出偽隨機序列上的位置,從而預測下一個。
在用于數據分析的Python中,模塊numpy.random對Python random進行了補充,該功能可以根據多種概率分布有效地生成樣本值的整個數組。
相比之下,Python的內置random模塊一次只能采樣一個值,而numpy.random可以更快地生成非常大的采樣。使用IPython魔術函數%timeit,可以看到哪個模塊的執行速度更快:
1
2
3
4
5
6
7
8In [1]: from random import normalvariate
In [2]: N = 1000000
In [3]: %timeit samples = [normalvariate(0, 1) for _ in xrange(N)]
1 loop, best of 3: 963 ms per loop
In [4]: %timeit np.random.normal(size=N)
10 loops, best of 3: 38.5 ms per loop
其他方法則不然。將np.random.randint(2)與random.randrange(2)進行比較,而NumPy則較慢。 NumPy:1.25 us,隨機:891 ns。并且np.random.rand()和random.random()的關系相同。
種子的來源和使用的分發配置文件將影響輸出-如果您正在尋找加密隨機性,則os.urandom()的種子將從設備顫動(即以太網或磁盤)中獲得幾乎真實的隨機字節(即/ BSD上的dev / random)
這樣可以避免您提供種子,從而避免產生確定性的隨機數。但是,隨機調用然后使您可以將數字擬合為一個分布(我稱之為科學隨機性-最終,您想要的只是一個隨機數的鐘形曲線分布,numpy最擅長于說明這一點。
所以,是的,堅持使用一個發生器,但是要確定您想要的隨機數-隨機,但是會偏離分布曲線,或者在沒有量子設備的情況下盡可能地隨機。
Paul非常感謝您,您的回答非常有用!我不是在尋找密碼隨機性,而是在做數學建模,偽隨機數對我來說足夠了。事實證明,由于我需要numpy進行二項式分布,并且我的程序調用了另一個使用random :(
總結
以上是生活随笔為你收集整理的python random 和numpy random_Python中numpy.random和random.random之间的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GTA5怎么刷钱
- 下一篇: vogal10是什么型号