日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python random 和numpy random_Python中numpy.random和random.random之间的区别

發布時間:2023/12/19 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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之间的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。