python模塊介紹-random:生成偽隨機數

jopen 10年前發布 | 54K 次閱讀 Python Python開發

python模塊介紹-random:生成偽隨機數

概述

這個模塊實現的偽隨機數生成器。

對于整數,從區間選取。對于序列,隨機元素。

有函數生成均勻的,正態分布(高斯),對數正態分布,負指數,γ和β分布的隨機數。對于角度分布,可以使用Mises分布。

幾乎所有的函數依賴于基本函數random(),它生成區間[0.0, 1.0)的隨機浮點。Python使用Mersenne Twister為核心的生成器。它生成53 bit精度的浮點值,周期為2的19937次方減1。 底層的C語言實現是快速和線程安全的。Mersenne Twister是目前最廣泛的測試隨機數生成器之一。然而因為生成的值是完全確定性的,所以不適合用于所有場合,尤其是加密。

該模塊的函數實際上是random.Random類的隱藏實例random的方法。你可以實例化你自己Random來實現不共享狀態的生成器。這對于多線程程序特別有用,為每個線程使用不同的實例,并使用jumpahead()方法使每個線程生成的序列不重疊。

類Random可以作為父類,random(), seed(), getstate(), setstate() and jumpahead()方法都可以重載。新生成器支持getrandbits()方法,允許randrange()方法在任意大區間中選擇。

WichmannHill是Random的子類,用純Python的實現了另外一個生成器。不推薦使用。

random模塊還提供SystemRandom類使用系統函數os.urandom()產生隨機數。

快速入門

>>> random.random()        # Random float x, 0.0 <= x < 1.00.37444887175646646>>> random.uniform(1, 10)  # Random float x, 1.0 <= x < 10.0 區間內的浮點數1.1800146073117523>>> random.randint(1, 10)  # Integer from 1 to 10, endpoints included7>>> random.randrange(0, 101, 2)  # Even integer from 0 to 100 Randrange不用生成range,會更高效26>>> random.choice('abcdefghij')  # Choose a random element'c'>>> items = [1, 2, 3, 4, 5, 6, 7]>>> random.shuffle(items)>>> items[7, 3, 2, 5, 6, 4, 1]>>> random.sample([1, 2, 3, 4, 5],  3)  # Choose 3 elements[4, 1, 5]

Seeding

Random()每次調用時會產生不同的值,設置了seed之后,就會產生有規律的恒定值。如果seed函數中沒有提供參數, 就默認使用系統時間.

import randomrandom.seed(1)for i in xrange(5):
    print '%04.3f' % random.random(),print

執行結果, 每次都產生一樣的結果:

# python random_seed.py0.134 0.847 0.764 0.255 0.495

保存狀態

random()使用的偽隨機算法的內部狀態可以保存起來并用于控制在后續運行中產生的數字以減少重復的值或值序列的可能。相關的函數為 getstate()和setstate()。random.seed 提供了隨機數生成的起點,可以用來生成一樣的隨機數。默認為當前時間作為起點。隨機生成的狀態可以通過getstate()保存,通過 setstate()恢復。

import randomimport osimport cPickle as pickleif os.path.exists('state.dat'):
    # Restore the previously saved state
    print 'Found state.dat, initializing random module'
    with open('state.dat', 'rb') as f:
        state = pickle.load(f)
    random.setstate(state)else:
    # Use a well-known start state
    print 'No state.dat, seeding'
    random.seed(1)# Produce random valuesfor i in xrange(3):
    print '%04.3f' % random.random(),print# Save state for next timewith open('state.dat', 'wb') as f:
    pickle.dump(random.getstate(), f)# Produce more random valuesprint '\nAfter saving state:'for i in xrange(3):
    print '%04.3f' % random.random(),print

執行結果:

# python random_state.pyFound state.dat, initializing random module0.255 0.495 0.449After saving state:0.652 0.789 0.094

本文地址

參考資料

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!