Python random库使用的一些简单例子
以下例子来自于<< Supercharged Python >>
例1:random包的测试
- 目的:测试random包提供的函数产生的随机数的随机性。
- 代码:
import random
# 用于测试random函数的随机性
def do_trials(n):
# 用于记录0-9出现的次数
hits = [0] * 10
# 随机生成n个0-9的数,并记录生成次数
for i in range(n):
a = random.randint(0, 9)
hits[a] += 1
# 打印每个数字出现的次数,及其出现次数与预期次数的比值
for i in range(10):
fss = '{}:{}\t {:.3}'
print(fss.format(i, hits[i], hits[i] / (n / 10)))
# do_trials(1000)
# do_trials(10000)
- 测试结果
可以以看到随着测试数据量的增大,随机性趋向于我们的预期值
例2:猜数字游戏
- 目的:使用random库开发一个小demo以熟悉该库
- 代码:
import random
from math import log2, ceil
# 猜数字游戏
def play_the_game():
# 玩家输入随机数生成范围
x = int(input('Please enter the range [1...x]:'))
# 计算猜到正确的数字最多需要多少次
t = ceil(log2(x+1))
print('Max. number of guesses needed is', t)
n = random.randint(1, x)
while True:
guess = int(input('Enter guess (0 to exit):'))
if guess == 0:
print('Exiting game.')
break
elif guess == n:
print('Success! You win.')
break
elif guess < n:
print('Too low.', end=' ')
else:
print('Too high.', end=' ')
# 可多次游戏
while True:
play_the_game()
ans = input('Want you play again?(Y or N):')
if not ans or ans[0] in 'Nn':
break
# play_the_game()
- 效果展示
例3:发牌机器
- 目的:熟悉random的shuffle函数(作用:打乱数据重排列)
- 代码:
import random
# 扑克牌类
class Deck:
# 构造函数
def __init__(self, n_decks=1):
self.card_list = [num + suit
for suit in '\u2665\u2666\u2663\u2660'
for num in 'A23456789TJQK'
for deck in range(n_decks)]
self.cards_in_play_list = []
self.discards_list = []
random.shuffle(self.card_list)
# 发牌
def deal(self):
if len(self.card_list) < 1:
random.shuffle(self.discards_list)
self.card_list = self.discards_list
self.discards_list = []
print('Reshuffling...!!')
new_card = self.card_list.pop()
self.cards_in_play_list.append(new_card)
return new_card
# 洗牌
def new_hand(self):
self.discards_list += self.cards_in_play_list
self.cards_in_play_list.clear()
# 生成6副扑克牌
dk = Deck(6)
# 模拟发五张牌
for i in range(5):
print(dk.deal(), end=' ')
- 结果
例4:绘制正态分布图
- 目的:直观可视化了解random的normalvariate函数
- 代码:
import random
def normal_chart(n):
# 将生成的数经处理后对应收集到20个桶,以便可视化正态分布图
hits = [0] * 20
for i in range(n):
x = random.normalvariate(100, 30)
j = int(x / 10)
if 0 <= j < 20:
hits[j] += 1
for i in hits:
print('*' * int(i * 320 / n))
# normal_chart(10000)
- 结果