首頁  >  文章  >  後端開發  >  Python的random模組詳解

Python的random模組詳解

小云云
小云云原創
2017-12-13 09:04:212886瀏覽

本文主要介紹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 73ffc5c575889e7383d59ddb18dea27ab,則是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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn