你真的了解Python的random模塊嗎?
random模塊
用于生成偽隨機(jī)數(shù)
源碼位置: Lib/random.py(看看就好,千萬別隨便修改)
真正意義上的隨機(jī)數(shù)(或者隨機(jī)事件)在某次產(chǎn)生過程中是按照實(shí)驗(yàn)過程中表現(xiàn)的分布概率隨機(jī)產(chǎn)生的,其結(jié)果是不可預(yù)測(cè)的,是不可見的。而計(jì)算機(jī)中的隨機(jī)函數(shù)是按照一定算法模擬產(chǎn)生的,其結(jié)果是確定的,是可見的。我們可以這樣認(rèn)為這個(gè)可預(yù)見的結(jié)果其出現(xiàn)的概率是100%。所以用計(jì)算機(jī)隨機(jī)函數(shù)所產(chǎn)生的“隨機(jī)數(shù)”并不隨機(jī),是偽隨機(jī)數(shù)。
計(jì)算機(jī)的偽隨機(jī)數(shù)是由隨機(jī)種子根據(jù)一定的計(jì)算方法計(jì)算出來的數(shù)值。所以,只要計(jì)算方法一定,隨機(jī)種子一定,那么產(chǎn)生的隨機(jī)數(shù)就是固定的。
只要用戶或第三方不設(shè)置隨機(jī)種子,那么在默認(rèn)情況下隨機(jī)種子來自系統(tǒng)時(shí)鐘。
Python的這個(gè)庫在底層使用通用的算法,經(jīng)過長(zhǎng)久的考驗(yàn),可靠性沒得說,但絕對(duì)不能用于密碼相關(guān)的功能。
一、基本方法
random.seed(a=None, version=2)
初始化偽隨機(jī)數(shù)生成器。如果未提供a或者a=None,則使用系統(tǒng)時(shí)間為種子。如果a是一個(gè)整數(shù),則作為種子。
random.getstate()
返回一個(gè)當(dāng)前生成器的內(nèi)部狀態(tài)的對(duì)象
random.setstate(state)
傳入一個(gè)先前利用getstate方法獲得的狀態(tài)對(duì)象,使得生成器恢復(fù)到這個(gè)狀態(tài)。
random.getrandbits(k)
返回一個(gè)不大于K位的Python整數(shù)(十進(jìn)制),比如k=10,則結(jié)果在0~2^10之間的整數(shù)。
二、針對(duì)整數(shù)的方法
random.randrange(stop)
random.randrange(start, stop[, step])
等同于choice(range(start, stop, step)),但并不實(shí)際創(chuàng)建range對(duì)象。
random.randint(a, b)
返回一個(gè)a <= N <= b的隨機(jī)整數(shù)N。等同于 randrange(a, b+1)
三、針對(duì)序列類結(jié)構(gòu)的方法
random.choice(seq)
從非空序列seq中隨機(jī)選取一個(gè)元素。如果seq為空則彈出 IndexError異常。
random.choices(population, weights=None, *, cum_weights=None, k=1)
3.6版本新增。從population集群中隨機(jī)抽取K個(gè)元素。weights是相對(duì)權(quán)重列表,cum_weights是累計(jì)權(quán)重,兩個(gè)參數(shù)不能同時(shí)存在。
random.shuffle(x[, random])
隨機(jī)打亂序列x內(nèi)元素的排列順序。只能針對(duì)可變的序列,對(duì)于不可變序列,請(qǐng)使用下面的sample()方法。
random.sample(population, k)
從population樣本或集合中隨機(jī)抽取K個(gè)不重復(fù)的元素形成新的序列。常用于不重復(fù)的隨機(jī)抽樣。返回的是一個(gè)新的序列,不會(huì)破壞原有序列。要從一個(gè)整數(shù)區(qū)間隨機(jī)抽取一定數(shù)量的整數(shù),請(qǐng)使用sample(range(10000000), k=60)類似的方法,這非常有效和節(jié)省空間。如果k大于population的長(zhǎng)度,則彈出ValueError異常。
四、真值分布
random模塊最高端的功能其實(shí)在這里。
random.random()
返回一個(gè)介于左閉右開[0.0, 1.0)區(qū)間的浮點(diǎn)數(shù)
random.uniform(a, b)
返回一個(gè)介于a和b之間的浮點(diǎn)數(shù)。如果a>b,則是b到a之間的浮點(diǎn)數(shù)。這里的a和b都有可能出現(xiàn)在結(jié)果中。
random.triangular(low, high, mode)
返回一個(gè)low <= N <=high的三角形分布的隨機(jī)數(shù)。參數(shù)mode指明眾數(shù)出現(xiàn)位置。
random.betavariate(alpha, beta)
β分布。返回的結(jié)果在0~1之間
random.expovariate(lambd)
指數(shù)分布
random.gammavariate(alpha, beta)
伽馬分布
random.gauss(mu, sigma)
高斯分布
random.lognormvariate(mu, sigma)
對(duì)數(shù)正態(tài)分布
random.normalvariate(mu, sigma)
正態(tài)分布
random.vonmisesvariate(mu, kappa)
卡帕分布
random.paretovariate(alpha)
帕累托分布
random.weibullvariate(alpha, beta)
五、可選擇的生成器
class random.SystemRandom([seed])
使用 os.urandom() 方法生成隨機(jī)數(shù)的類,由操作系統(tǒng)提供源碼,不一定所有系統(tǒng)都支持
六、典型的例子
>>> random() # 隨機(jī)浮點(diǎn)數(shù): 0.0 <= x < 1.0 0.37444887175646646 >>> uniform(2.5, 10.0) # 隨機(jī)浮點(diǎn)數(shù): 2.5 <= x < 10.0 3.1800146073117523 >>> randrange(10) # 0-9的整數(shù): 7 >>> randrange(0, 101, 2) # 0-100的偶數(shù) 26 >>> choice(['win', 'lose', 'draw']) # 從序列隨機(jī)選擇一個(gè)元素 'draw' >>> deck = 'ace two three four'.split() >>> shuffle(deck) # 對(duì)序列進(jìn)行洗牌,改變?cè)蛄? >>> deck ['four', 'two', 'ace', 'three'] >>> sample([10, 20, 30, 40, 50], k=4) # 不改變?cè)蛄械某槿≈付〝?shù)目樣本,并生成新序列 [40, 10, 50, 30] >>> # 6次旋轉(zhuǎn)紅黑綠輪盤(帶權(quán)重可重復(fù)的取樣),不破壞原序列 >>> choices(['red', 'black', 'green'], [18, 18, 2], k=6) ['red', 'green', 'black', 'black', 'red', 'black'] >>> # 德州撲克計(jì)算概率Deal 20 cards without replacement from a deck of 52 playing cards >>> # and determine the proportion of cards with a ten-value >>> # (a ten, jack, queen, or king). >>> deck = collections.Counter(tens=16, low_cards=36) >>> seen = sample(list(deck.elements()), k=20) >>> seen.count('tens') / 20 0.15 >>> # 模擬概率Estimate the probability of getting 5 or more heads from 7 spins >>> # of a biased coin that settles on heads 60% of the time. >>> trial = lambda: choices('HT', cum_weights=(0.60, 1.00), k=7).count('H') >= 5 >>> sum(trial() for i in range(10000)) / 10000 0.4169 >>> # Probability of the median of 5 samples being in middle two quartiles >>> trial = lambda : 2500 <= sorted(choices(range(10000), k=5))[2] < 7500 >>> sum(trial() for i in range(10000)) / 10000 0.7958
下面是生成一個(gè)包含大寫字母A-Z和數(shù)字0-9的隨機(jī)4位驗(yàn)證碼的程序
import random checkcode = '' for i in range(4): current = random.randrange(0,4) if current != i: temp = chr(random.randint(65,90)) else: temp = random.randint(0,9) checkcode += str(temp) print(checkcode)
下面是生成指定長(zhǎng)度字母數(shù)字隨機(jī)序列的代碼:
#!/usr/bin/env python # -*- coding:utf-8 -*- import random, string def gen_random_string(length): # 數(shù)字的個(gè)數(shù)隨機(jī)產(chǎn)生 num_of_numeric = random.randint(1,length-1) # 剩下的都是字母 num_of_letter = length - num_of_numeric # 隨機(jī)生成數(shù)字 numerics = [random.choice(string.digits) for i in range(num_of_numeric)] # 隨機(jī)生成字母 letters = [random.choice(string.ascii_letters) for i in range(num_of_letter)] # 結(jié)合兩者 all_chars = numerics + letters # 洗牌 random.shuffle(all_chars) # 生成最終字符串 result = ''.join([i for i in all_chars]) return result if __name__ == '__main__': print(gen_random_string(64))
總結(jié)
以上就是本文關(guān)于你真的了解Python的random模塊的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
- Python random模塊(獲取隨機(jī)數(shù))常用方法和使用例子
- Python內(nèi)置random模塊生成隨機(jī)數(shù)的方法
- Python random模塊常用方法
- Python中random模塊生成隨機(jī)數(shù)詳解
- Python隨機(jī)數(shù)random模塊使用指南
- python中random模塊詳解
- 對(duì)Python random模塊打亂數(shù)組順序的實(shí)例講解
- Python3 Random模塊代碼詳解
- Python實(shí)現(xiàn)簡(jiǎn)單生成驗(yàn)證碼功能【基于random模塊】
- Python random模塊使用詳解
相關(guān)文章
python下載文件記錄黑名單的實(shí)現(xiàn)代碼
這篇文章主要介紹了python下載文件記錄黑名單的實(shí)現(xiàn)代碼,需要的朋友可以參考下2017-10-10解決python 3 urllib 沒有 urlencode 屬性的問題
今天小編就為大家分享一篇解決python 3 urllib 沒有 urlencode 屬性的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08利用Python實(shí)現(xiàn)繪制論文中的曲線圖
這篇文章主要為大家詳細(xì)介紹了如何利用Python語言實(shí)現(xiàn)繪制論文中需要的曲線圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-03-03Python利用Flask動(dòng)態(tài)生成漢字頭像
這篇文章主要為大家詳細(xì)介紹了Python如何利用Flask動(dòng)態(tài)生成一個(gè)漢字頭像,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定的幫助,需要的可以參考一下2023-01-01使用python連接Linux服務(wù)器發(fā)送指定命令的示例代碼
這篇文章主要介紹了使用python連接Linux服務(wù)器發(fā)送指定命令,首先安裝paramiko庫,使用paramiko庫連接linux,使用paramiko庫上傳下載文件,結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10