簡體   English   中英

Python中numpy.random和random.random的區別

[英]Differences between numpy.random and random.random in Python

我在 Python 中有一個大腳本。 我在其他人的代碼中啟發了自己,所以我最終將numpy.random模塊用於某些事情(例如,用於創建從二項分布中獲取的隨機數數組),在其他地方我使用模塊random.random

有人可以告訴我兩者之間的主要區別嗎? 查看兩者的文檔網頁,在我看來numpy.random只是有更多方法,但我不清楚隨機數的生成有何不同。

我問的原因是因為我需要為我的主程序播種以進行調試。 但它不起作用,除非我在我正在導入的所有模塊中使用相同的隨機數生成器,這是正確的嗎?

另外,我在另一篇文章中讀到了關於不使用numpy.random.seed()的討論,但我真的不明白為什么這是一個壞主意。 如果有人向我解釋為什么會這樣,我將不勝感激。

您已經做出了許多正確的觀察!

除非您想為兩個隨機生成器播種,否則從長遠來看,選擇一個或另一個生成器可能更簡單。 但是,如果您確實需要同時使用兩者,那么是的,您還需要同時為它們播種,因為它們彼此獨立地生成隨機數。

對於numpy.random.seed() ,主要困難在於它不是線程安全的 - 也就是說,如果您有許多不同的執行線程,使用它是不安全的,因為如果兩個不同的線程正在執行,它不能保證工作function 同時。 如果您不使用線程,並且可以合理地預期將來不需要以這種方式重寫程序,則numpy.random.seed()應該沒問題。 如果有任何理由懷疑您將來可能需要線程,從長遠來看,按照建議進行操作會更安全,並制作numpy.random.Random class 的本地實例 據我所知, random.random.seed()是線程安全的(或者至少,我沒有發現任何相反的證據)。

numpy.random庫包含一些在科學研究中常用的額外概率分布,以及一些用於生成隨機數據 arrays 的便利函數。 random.random庫更輕量級,如果您不進行科學研究或其他類型的統計工作,應該沒問題。

否則,它們都使用梅森捻線器序列來生成它們的隨機數,而且它們都是完全確定的——也就是說,如果你知道一些關鍵信息,就可以絕對確定地預測接下來會出現什么數字 因此,numpy.random 和 random.random 都不適合任何嚴重的加密用途 但是因為這個序列非常長,所以在你不擔心人們試圖對你的數據進行逆向工程的情況下,兩者都可以生成隨機數。 這也是需要播種隨機值的原因——如果你每次都從同一個地方開始,你總是會得到相同的隨機數序列!

附帶說明一下,如果您確實需要加密級別的隨機性,則應該使用secrets模塊,或者如果您使用的是早於 Python 3.6 的 Python 版本,則應使用Crypto.Random之類的東西。

From Python for Data Analysis , the module numpy.random supplements the Python random with functions for efficiently generating whole arrays of sample values from many kinds of probability distributions.

相比之下,Python 內置的random模塊一次只采樣一個值,而numpy.random可以更快地生成非常大的樣本。 使用 IPython 魔法 function %timeit可以看到哪個模塊執行得更快:

In [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

種子的來源和使用的分布配置文件將影響輸出 - 如果您正在尋找加密隨機性,來自 os.urandom() 的種子將從設備抖動(即以太網或磁盤)獲得幾乎真實的隨機字節(即 / BSD 上的開發/隨機)

這將避免您提供種子並因此生成確定性隨機數。 然而,隨機調用然后允許您將數字擬合到分布(我稱之為科學隨機性 - 最終您想要的只是隨機數的鍾形曲線分布,numpy 最擅長解決這個問題。

所以,是的,堅持使用一個發生器,但決定你想要什么隨機 - 隨機,但絕對來自分布曲線,或者在沒有量子設備的情況下盡可能隨機。

讓我感到驚訝的是numpy.randomrandom中都存在randint(a, b)方法,但是它們的上限行為不同。

random.randint(a, b)返回一個隨機 integer N 使得a <= N <= b randrange(a, b+1)別名。 它包含b 隨機文件

但是,如果您調用numpy.random.randint(a, b) ,它將返回低(包括)到高(不包括)。 Numpy 文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM