Python之random模块的使用
random模块的作用
快速随机数的生成器
1、随机生成浮点数(0~1)的示例
import random for i in range(5): print('%4.3f' % random.random(), end=' ')
测试效果
0.265 0.866 0.277 0.146 0.359
2、指定范围生成随机数
import random for i in range(5): print('{:04.3f}'.format(random.uniform(1,100), end=' '))
测试效果
47.540
13.185
5.518
46.968
87.755
以上生成随机数的公式为:min + (max - min) * random()
3、通过指定种子数,实现随机数的变化,种子数没有修改则一直生成相同的随机数
import random random.seed(1) for i in range(5): print('{:04.3f}'.format(random.random()), end=' ')
测试效果
0.134 0.847 0.764 0.255 0.495
4、通过pickle模块序列化随机的状态,减少随机数的重复的示例
import random import os import pickle if os.path.exists('state.dat'): print('找到state.dat,初始化随机模块') with open('state.dat', 'rb') as rf: state = pickle.load(rf) random.setstate(state()) else: print('找不到state.dat,设置种子') random.seed(1) for i in range(3): print('{:04.3f}'.format(random.random()), end=' ') with open('state.dat', 'wb') as wf: pickle.dump(random.getstate, wf) print('\n保存state.dat') for i in range(3): print('{:04.3f}'.format(random.random()), end=' ')
测试效果
找到state.dat,初始化随机模块 0.028 0.836 0.433 保存state.dat 0.762 0.002 0.445
5、随机生成整数或负数的示例
import random print('[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=' ')
测试效果
[1,100] 41 24 97
[-5,5] 1 1 2
6、指定区间生成随机数的示例
import random for i in range(3): print(random.randrange(0, 101, 5), end=' ')
测试效果
30 45 35
7、选择随机数的示例
import random outcomes = { 'heads': 0, 'tails': 0 } sides = list(outcomes.keys()) for i in range(10000): outcomes[random.choice(sides)] += 1 print('Heads', outcomes['heads']) print('Tails', outcomes['tails'])
测试效果
Heads 4973
Tails 5027
8、随机抽牌的示例
import random import itertools FACE_CARDS = ('J', 'Q', 'K', 'A') SUITS = ('H', 'D', 'C', 'S') def new_deck(): """ 生成一副朴克牌 itertools.product : 两个迭代器卡笛尔匹配 itertools.chain : 两个迭代器并集在一起 :return: """ return [ '{:>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] # 取前13张 p_deck = p_deck[13:] # 取后13张 for j in row: print(j, end=' ') print() deck = new_deck() print('生成一副朴克牌') show_deck(deck) random.shuffle(deck) print('随机抽牌后') show_deck(deck) # 处理4手5张牌 hands = [[], [], [], []] for i in range(5): for h in hands: h.append(deck.pop()) print('\n随机处理4位5张牌') for n, h in enumerate(hands): print('{}:'.format(n + 1), end=' ') for c in h: print(c, end=' ') print() print('\n读牌') show_deck(deck)
测试效果
生成一副朴克牌 2 H 2 D 2 C 2 S 3 H 3 D 3 C 3 S 4 H 4 D 4 C 4 S 5 H 5 D 5 C 5 S 6 H 6 D 6 C 6 S 7 H 7 D 7 C 7 S 8 H 8 D 8 C 8 S 9 H 9 D 9 C 9 S 10 H 10 D 10 C 10 S J H J D J C J S Q H Q D Q C Q S K H K D K C K S A H A D A C A S 随机抽牌后 6 D 9 D 7 C 5 S 10 H K H 2 D 4 D K S 2 H 5 D J C 8 S Q H A S 2 S A C A D 9 H 5 H 3 C 10 S A H 5 C 2 C 9 S 8 C 4 C 3 D Q S J S 10 D 9 C 8 D Q C 6 S K C 6 H 7 H 4 S 7 S J D 4 H 3 H J H Q D 7 D 3 S K D 8 H 6 C 10 C 随机处理4位5张牌 1: 10 C 3 S 3 H 4 S 6 S 2: 6 C 7 D 4 H 7 H Q C 3: 8 H Q D J D 6 H 8 D 4: K D J H 7 S K C 9 C 读牌 6 D 9 D 7 C 5 S 10 H K H 2 D 4 D K S 2 H 5 D J C 8 S Q H A S 2 S A C A D 9 H 5 H 3 C 10 S A H 5 C 2 C 9 S 8 C 4 C 3 D Q S J S 10 D
9、实现指定字符串随机挑选的示例
import random words = [1, 1, 'a', 'b', 'a', 'c', 'd'] for w in random.sample(words, 3): print(w)
测试效果
a
a
1
10、利用实例化Random类,来实现随机数的生成
import random import time print('初始化') r1 = random.Random() r2 = random.Random() for i in range(3): print('{:04.3f} {:04.3f}'.format(r1.random(), r2.random())) print('设置种子数') 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()))
测试效果
初始化 0.953 0.904 0.575 0.467 0.852 0.004 设置种子数 0.065 0.065 0.879 0.879 0.357 0.357
11、通过操作系统随机数的算法来实现生成随机数
import random import time print('初始化') r1 = random.SystemRandom() r2 = random.SystemRandom() for i in range(3): print('{:04.3f} {:04.3f}'.format(r1.random(), r2.random())) print('设置种子数') 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()))
测试效果
初始化 0.300 0.584 0.188 0.202 0.054 0.475 设置种子数 0.412 0.837 0.804 0.129 0.980 0.120 注意: 1、使用操作系统算法来实现随机数,seed()和setstate()不生效。 2、算法生成,会调用操作系统的os.urandom库来生成。