Python的random模組詳解

小云云
發布: 2023-03-17 21:08:02
原創
2858 人瀏覽過

本文主要介紹Python的random模組的相關內容,具有一定藉鏡價值,需要的朋友可以參考下,希望能幫助大家。

random模組

用於產生偽隨機數

真正意義上的隨機數(或隨機事件)在某次產生過程中是按照實驗過程中表現的分佈機率隨機產生的,其結果是不可預測的,是不可見的。而計算機中的隨機函數是依照某一演算法模擬產生的,其結果是確定的,是可見的。我們可以這樣認為這個可預見的結果其出現的機率是100%。所以用計算機隨機函數所產生的「隨機數」並不隨機,是偽隨機數。

計算機的偽隨機數是由隨機種子根據一定的計算方法計算出來的數值。所以,只要計算方法一定,隨機種子一定,那麼產生的隨機數就是固定的。

只要使用者或第三方不設定隨機種子,那麼在預設情況下隨機種子來自系統時鐘。

Python的這個函式庫在底層使用通用的演算法,經過長久的考驗,可靠性沒得說,但絕對不能用於密碼相關的功能。

一、基本方法

#random.seed(a=None, version=2)<br>初始化偽隨機數產生器。如果未提供a或a=None,則使用系統時間為種子。如果a是整數,則作為種子。

random.getstate()
傳回一個目前生成器的內部狀態的物件

random.setstate(state)<br>傳入一個先前利用getstate方法獲得的狀態對象,使得生成器恢復到這個狀態。

random.getrandbits(k)
傳回一個不大於K位元的Python整數(十進位),例如k=10,則結果在0~2^10之間的整數。

二、針對整數的方法

#random.randrange(stop)<br>

random.randrange(start, stop[, step])
等同於choice(range(start, stop, step)),但並非實際建立range物件。

random.randint(a, b)
傳回一個a <= N <= b的隨機整數N。等同於randrange(a, b+1)

三、針對序列類別結構的方法

random. choice(seq)
從非空序列seq中隨機選取一個元素。如果seq為空則彈出 IndexError異常。

random.choices(population, weights=None, *, cum_weights=None, k=1)
3.6版本新增。從population集群中隨機抽取K個元素。 weights是相對權重列表,cum_weights是累計權重,兩個參數不能同時存在。

random.shuffle(x[, random])
隨機打亂序列x內元素的排列順序。只能針對可變的序列,對於不可變序列,請使用下面的sample()方法。

random.sample(population, k)
從population樣本或集合中隨機抽取K個不重複的元素形成新的序列。常用於不重複的隨機抽樣。回傳的是一個新的序列,不會破壞原有序列。要從一個整數區間隨機抽取一定數量的整數,請使用sample(range(10000000), k=60)類似的方法,這非常有效且節省空間。如果k大於population的長度,則彈出ValueError異常。

四、真值分佈

#random模組最高階的功能其實在這裡。

random.random()
傳回一個介於左閉右開[0.0, 1.0)區間的浮點數

random.uniform( a, b)
傳回介於a和b之間的浮點數。如果a>b,則是b到a之間的浮點數。這裡的a和b都有可能出現在結果中。

random.triangular(low, high, mode)
傳回一個low <= N <=high的三角形分佈的隨機數。參數mode指明眾數出現位置。

random.betavariate(alpha, beta)
β分佈。傳回的結果在0~1之間

random.expovariate(lambd)
指數分佈

random.gammavariate(alpha, beta)
伽瑪分佈

random.gauss(mu, sigma)<br>高斯分佈

random.lognormvariate(mu, sigma)
對數常態分佈

random.normalvariate(mu, sigma)
常態分佈

random.vonmisesvariate( mu, kappa)
卡帕分佈

random.paretovariate(alpha)<br>帕累托分佈

random.weibullvariate (alpha, beta)

五、可選擇的生成器

class random.SystemRandom( [seed])
使用os.urandom() 方法產生隨機數的類,由作業系統提供原始碼,不一定所有系統都支援

六、典型的例子

>>> random()               # 随机浮点数: 0.0 <= x < 1.0
0.37444887175646646

>>> uniform(2.5, 10.0)          # 随机浮点数: 2.5 <= x < 10.0
3.1800146073117523

>>> randrange(10)            # 0-9的整数:
7

>>> randrange(0, 101, 2)         # 0-100的偶数
26

>>> choice([&#39;win&#39;, &#39;lose&#39;, &#39;draw&#39;])   # 从序列随机选择一个元素
&#39;draw&#39;

>>> deck = &#39;ace two three four&#39;.split()
>>> shuffle(deck)            # 对序列进行洗牌,改变原序列
>>> deck
[&#39;four&#39;, &#39;two&#39;, &#39;ace&#39;, &#39;three&#39;]

>>> sample([10, 20, 30, 40, 50], k=4)  # 不改变原序列的抽取指定数目样本,并生成新序列
[40, 10, 50, 30]

>>> # 6次旋转红黑绿*(带权重可重复的取样),不破坏原序列
>>> choices([&#39;red&#39;, &#39;black&#39;, &#39;green&#39;], [18, 18, 2], k=6)
[&#39;red&#39;, &#39;green&#39;, &#39;black&#39;, &#39;black&#39;, &#39;red&#39;, &#39;black&#39;]

>>> # 德州扑克计算概率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(&#39;tens&#39;) / 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(&#39;HT&#39;, cum_weights=(0.60, 1.00), k=7).count(&#39;H&#39;) >= 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
登入後複製

下面是產生一個包含大寫字母A-Z和數字0-9的隨機4位驗證碼的程式

import random
 
checkcode = &#39;&#39;
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)
登入後複製

#以下是產生指定長度字母數字隨機序列的程式碼:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import random, string

def gen_random_string(length):
  # 数字的个数随机产生
  num_of_numeric = random.randint(1,length-1)
  # 剩下的都是字母
  num_of_letter = length - num_of_numeric
  # 随机生成数字
  numerics = [random.choice(string.digits) for i in range(num_of_numeric)]
  # 随机生成字母
  letters = [random.choice(string.ascii_letters) for i in range(num_of_letter)]
  # 结合两者
  all_chars = numerics + letters
  # 洗牌
  random.shuffle(all_chars)
  # 生成最终字符串
  result = &#39;&#39;.join([i for i in all_chars])
  return result

if __name__ == &#39;__main__&#39;:
  print(gen_random_string(64))
登入後複製

#相關推薦:

Python實作字串匹配演算法實例程式碼

Python與ruby之間的異同對比

python中關於logging函式庫的使用總結

#

以上是Python的random模組詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!