random---伪随机数生成器
python3.5
作用:實現了多種類型的偽隨機數生成器
random模塊基于Mersenne Twister 算法提供了一個快速偽隨機數生成器。原先開發這個生成器是為了向蒙特卡洛模擬生成輸入,Mersenne Twister算法會生成有一個大周期的近均勻分布的數,以適用于各種類型的應用。
?
1.生成隨機數
random()函數從所生成的序列返回下一個隨機的浮點數值。返回的所有值都在0-n之間。
import random
for i in range(5):
??? print("%04.3f" % random.random())
0.166
0.201
0.282
0.920
0.429
要生成一個指定數值區間內的數,則要使用uniform().
import random
for i in range(3):
??? print("%.3f" % random.uniform(1,100))
3.520
79.323
15.854
傳入最大值和最小值,uniform()會使用公式min+(max-min)*random()來調整random()的返回值
?
2.指定種子
每次調用random()會生成不同的值,在一個非常的的周期之后數字才會重復。這對于生成唯一值或變化的值很有用,不過有些情況下可能需要提供相同的數據集,從而以不同的方式處理。對此,一種方法是使用一個程序來生成隨機數,并保存這些隨機數,以便通過一個單獨的方式另行處理。不過對于量很大的數據來說可能并不實用,所以random包含了一個seed()函數,用來初始化偽隨機數生成器,使它能生成一個期望的值集。
種子(seed)值會控制生成偽隨機數所用公式產生的第一個值,由于公式是確定的,改變種子也就設置了整個要生成的序列。seed()的參數可以是任意可散列對象。默認會使用平臺特定的隨機源(如果有的話)。否則,會使用當前時間。
【偽隨機數之所以是偽,應該就是這個原因了吧,種子定了,整個序列就定了,通過不短變換種子值得到隨機數】
?
3.保存狀態
random()使用的偽隨機算法的內部狀態可以保存,并用于控制后續各輪生成的隨機數。繼續生成隨機數之前恢復前一個狀態,這會減少有之前輸入得到重復的值或值序列的可能性。getstate()函數會返回一些數據,以后可以用setstate()利用這些數據重新初始化偽隨機數生成器。
import random
import os
import pickle
if os.path.exists('state.dat'):
??? print("Found state.dat, initializing random module")
??? with open('state.dat','rb') as fp:
??????? state=pickle.load(fp)
??? random.setstate(state)
else:
??? print("No state.dat, seeding")
??? random.seed(1)
for i in range(3):
??? print("%.3f" % random.random())
print()
with open('state.dat','wb') as fp:
??? pickle.dump(random.getstate(),fp)
print("\nAfter saving state")
for i in range(3):
??? print("%.3f" % random.random())
print()
gerstate()返回的數據是一個實現細節,所以這個例子用pickle將數據保存到一個文件,不過可以把它當作一個黑盒。如果程序開始是這個文件存在,則加載原來的狀態并繼續。每次運行時都會在保存之前及之后生成一些書,以展示恢復狀態會導致生成器在次生成同樣的值
【相當于電影重放一樣,設置一個節點getstate()[記錄播放到的時間],用setstate()回到上次節點的時間,再次播放一遍】
?
4.隨機整數
random()將生成浮點數。可以吧結果轉換為整數,不過直接使用randint()生成整數會更方便。
import random
print("[1,100]")
for i in range(5):
??? print(random.randint(1,100),end=' ')
print()
print("[-10,5]")
for i in range(5):
??? print(random.randint(-10,5),end=' ')
?
?
randint()的參數的值是閉區間的兩端。這些數可以是正數或負數,不過第一個值要小于第二個值。
randrange()是從區間選擇值的一種更一般的形式。除了開始值(start)和結束值(stop),randrange()還支持步長(step)參數,所以它完全等價于從range(start,stop,step)選擇一個隨機值。不過randrange更高效,因為它并沒有真正構造區間。
?
5.選擇隨機元素 choice()
在一個序列中隨機選擇。
模擬拋硬幣:
view plaincopy to clipboardprint這樣不必再使用數字進行轉換
?
。。。,排列,采樣,多個并發生成器,SystemRandom,非均勻分布,角分布,大小分布
轉載于:https://www.cnblogs.com/DreamZero/p/5071558.html
總結
以上是生活随笔為你收集整理的random---伪随机数生成器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 孕妇梦到蛇走了预示着什么
- 下一篇: PAT 1100