Python之random模块的使用

 random模块的作用

快速随机数的生成器

1、随机生成浮点数(0~1)的示例

import random

for i in range(5):
    print('%4.3f' % random.random(), end=' ')
random_random.py

测试效果

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=' '))
random_uniform.py

测试效果

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=' ')
   
random_seed.py

测试效果

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=' ')
random_state.py

测试效果

找到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=' ')
random_randint.py

测试效果

[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=' ')
random_randrange.py

测试效果

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'])
random_choice.py

测试效果

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)
random_shuffle.py

测试效果

生成一副朴克牌
 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)
random_sample.py

测试效果

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()))
random_random_class.py

 测试效果

初始化
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()))
random_system_random.py

测试效果

初始化
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库来生成。
posted @ 2020-05-14 10:54  小粉优化大师  阅读(208)  评论(0编辑  收藏  举报