北票網(wǎng)站建設(shè)黃金網(wǎng)站軟件免費(fèi)
random隨機(jī)數(shù)
1.概述
random用來生成一些隨機(jī)數(shù),下面介紹random模塊提供的方法根據(jù)需求生成不同的隨機(jī)數(shù)。
2.random常用操作
2.1.random默認(rèn)隨機(jī)數(shù)
random()函數(shù)返回一個隨機(jī)的浮點(diǎn)值,默認(rèn)返回值范圍在0 <= n < 1.0區(qū)間
import randomfor i in range(5):print('%04.3f' % random.random(), end=' ')
print()
運(yùn)行結(jié)果
0.481 0.369 0.876 0.659 0.124
2.2.指定范圍隨機(jī)數(shù)
生成一個指定數(shù)值區(qū)間內(nèi)的數(shù),則要用uniform()
import randomfor i in range(5):print('{:04.3f}'.format(random.uniform(1, 100)), end=' ')
print()
運(yùn)行結(jié)果
68.240 10.768 30.234 80.859 91.582
randrange()是從區(qū)間選擇值的方式,可以指定開始值,結(jié)束值,步長。
randrange更高效,因為它并沒有真正構(gòu)造區(qū)間。
import randomfor i in range(3):print(random.randrange(0, 101, 5), end=' ')
print()
運(yùn)行結(jié)果
90 15 50
2.3.指定種子
如果需要重復(fù)使用相同值的隨機(jī)序列,random提供了seed函數(shù),他可以生成一個期望的值集。seed參數(shù)可以使任意可散列對象。
例如第一次運(yùn)行random生成了一系列的隨機(jī)值,第二次運(yùn)行希望使用第一次生成的值,通過設(shè)置相同的seed值,即可保持隨機(jī)的值不變。
import randomrandom.seed(1)for i in range(5):print('{:04.3f}'.format(random.random()), end=' ')
print()
重復(fù)運(yùn)行上面的代碼,只要不改變seed值,它生成的隨機(jī)值是一樣的。
# 第一次運(yùn)行
0.134 0.847 0.764 0.255 0.495
#第二次運(yùn)行
0.134 0.847 0.764 0.255 0.495
2.4.隨機(jī)整數(shù)
random將生成浮點(diǎn)數(shù),可以把結(jié)果轉(zhuǎn)換為整數(shù),不過直接使用randint生成整數(shù)會更方便。
import randomprint('[1, 100]:', end=' ')for i in range(3):print(random.randint(1, 100), end=' ')print('\n[-5, 5]:', end=' ')
for i in range(3):print(random.randint(-5, 5), end=' ')
print()
運(yùn)行代碼,返回整數(shù)隨機(jī)值
[1, 100]: 4 50 56
[-5, 5]: 4 -5 2
2.5.隨機(jī)選擇元素
random包含一個choice()函數(shù),可以從隨機(jī)序列中隨機(jī)選擇值。下面模擬一個拋硬幣10 000次統(tǒng)計面朝上和面朝下次數(shù)。
import randomoutcomes = {'heads': 0,'tails': 0,
}
sides = list(outcomes.keys())for i in range(10000):outcomes[random.choice(sides)] += 1print('Heads:', outcomes['heads'])
print('Tails:', outcomes['tails'])
運(yùn)行結(jié)果,統(tǒng)計了隨機(jī)選擇了硬幣的次數(shù)。
Heads: 5055
Tails: 4945
2.6.排列
要模擬一個撲克牌游戲,需要把一副撲克牌混起來,然后發(fā)牌,同一張牌不能重復(fù)使用??梢杂胹huffle()洗牌,然后在發(fā)牌時刪除所發(fā)的牌。
import random
import itertoolsFACE_CARDS = ('J', 'Q', 'K', 'A')
SUITS = ('H', 'D', 'C', 'S')def new_deck():return [# Always use 2 places for the value, so the strings# are a consistent width.'{:>2}{}'.format(*c)for c in itertools.product(itertools.chain(range(2, 11), FACE_CARDS),SUITS,)]def show_deck(deck):p_deck = deck[:]while p_deck:row = p_deck[:13]p_deck = p_deck[13:]for j in row:print(j, end=' ')print()# Make a new deck, with the cards in order
deck = new_deck()
print('Initial deck:')
show_deck(deck)# Shuffle the deck to randomize the order
random.shuffle(deck)
print('\nShuffled deck:')
show_deck(deck)# Deal 4 hands of 5 cards each
hands = [[], [], [], []]for i in range(5):for h in hands:h.append(deck.pop())# Show the hands
print('\nHands:')
for n, h in enumerate(hands):print('{}:'.format(n + 1), end=' ')for c in h:print(c, end=' ')print()# Show the remaining deck
print('\nRemaining deck:')
show_deck(deck)
2.7.不重復(fù)采樣
有些時候生成的隨機(jī)數(shù)可能會包含重復(fù)值,使用sample()函數(shù)可以從序列中隨機(jī)取值保證值不重復(fù)。
from random import sample
data = [i for i in range(100)] # 列表推導(dǎo)式
result = sample(data, 10)
print(result)
運(yùn)行上面的代碼,sample從列表中隨機(jī)取值,保證取到的值不重復(fù)
[86, 34, 56, 48, 21, 75, 79, 3, 57, 38]
2.8.并發(fā)生成隨機(jī)數(shù)
random包括一個Random類,管理多個隨機(jī)數(shù)狀態(tài),每個實(shí)例都可以單獨(dú)使用互不干擾。
import random
import timeprint('Default initializiation:\n')r1 = random.Random()
r2 = random.Random()for i in range(3):print('{:04.3f} {:04.3f}'.format(r1.random(), r2.random()))print('\nSame seed:\n')seed = time.time()
r1 = random.Random(seed)
r2 = random.Random(seed)for i in range(3):print('{:04.3f} {:04.3f}'.format(r1.random(), r2.random()))
運(yùn)行上面的代碼,第二個使用了seed兩個隨機(jī)對象的值是相同的。
Default initializiation:0.666 0.946
0.080 0.385
0.315 0.768Same seed:0.112 0.112
0.657 0.657
0.064 0.064
2.9.系統(tǒng)隨機(jī)
系統(tǒng)提供了一個隨機(jī)數(shù)生成器,random通過SystemRandom類提供的功能,可以生成隨機(jī)數(shù)。不過使用os.urandom()生成值,該值構(gòu)成所有其他算法的基礎(chǔ)。
SystemRandom產(chǎn)生的序列是不可再生的,來自于系統(tǒng)的隨機(jī)性而不是軟件狀態(tài),所以seed不再起作用。
import random
import timeprint('Default initializiation:\n')r1 = random.SystemRandom()
r2 = random.SystemRandom()for i in range(3):print('{:04.3f} {:04.3f}'.format(r1.random(), r2.random()))print('\nSame seed:\n')seed = time.time()
r1 = random.SystemRandom(seed)
r2 = random.SystemRandom(seed)for i in range(3):print('{:04.3f} {:04.3f}'.format(r1.random(), r2.random()))
運(yùn)行代碼,結(jié)果顯示seed不再起作用。
Default initializiation:0.649 0.422
0.560 0.225
0.530 0.189Same seed:0.526 0.408
0.293 0.111
0.032 0.837