ZetCode

Python random 模块

最后修改于 2024 年 1 月 29 日

Python random 模块教程展示了如何在 Python 中生成伪随机数。

随机数生成器

随机数生成器 (RNG) 生成一组值,这些值在外观上不显示任何可区分的模式。随机数生成器分为两类:硬件随机数生成器和伪随机数生成器。硬件随机数生成器被认为可以生成真正的随机数。伪随机数生成器基于软件算法生成值。它们生成看起来随机的值。但是这些值是确定性的,如果知道算法,就可以重现。

在计算中,随机生成器用于赌博、游戏、模拟或密码学。

注意: 出于安全目的,必须使用密码学上安全的伪随机数生成器。

为了提高伪随机数生成器的质量,操作系统使用从设备驱动程序、用户输入延迟或来自一个或多个硬件组件的抖动收集的环境噪声。这是密码学上安全的伪随机数生成器的核心。

Python random 模块

内置的 Python random 模块实现了用于各种分布的伪随机数生成器。 Python 使用 Mersenne Twister 算法来生成其伪随机数。 此模块不适合安全性。 对于安全相关的任务,建议使用 secrets 模块。

种子

种子是初始化随机数生成器的值。 随机数生成器通过对先前的值执行某些操作来生成值。 当算法启动时,种子是生成器运行的初始值。 生成器最重要和最困难的部分是提供一个接近真正随机数的种子。

在 Python 中,种子值由 random.seed 函数提供。 如果未明确给出该值,Python 将使用系统时钟或其他随机源。

注意: 相同的种子会生成相同的伪随机数集。

Python 随机数 - 相同的种子

在下面的示例中,我们使用相同的种子。

same_seed.py
#!/usr/bin/python

import random


myseed = 16

random.seed(myseed)

print(random.random())
print(random.random())
print(random.random())

print('********************************')

random.seed(myseed)

print(random.random())
print(random.random())
print(random.random())

相同的种子值产生相同的伪随机值。

$ ./same_seed.py 
0.36152277491407514
0.480480665601294
0.4169526266056648
********************************
0.36152277491407514
0.480480665601294
0.4169526266056648

Python random.randint

random.randint 函数生成 [x, y] 范围内的整数。

rand_int.py
#!/usr/bin/python

import random


val = random.randint(1, 10)
print(val)

val = random.randint(1, 10)
print(val)

val = random.randint(1, 10)
print(val)

val = random.randint(1, 10)
print(val)

该示例生成四个介于数字 1 和 10 之间的随机整数。

$ ./rand_int.py 
10
4
9
3

Python random.randrange

random.randrange 函数排除区间的右侧。 它选取 [x, y) 之间的值。

rand_range.py
#!/usr/bin/python

import random


val = random.randrange(1, 10)
print(val)

val = random.randrange(1, 10)
print(val)

val = random.randrange(1, 10)
print(val)

val = random.randrange(1, 10)
print(val)

该示例生成四个介于数字 1 和 10 之间的随机整数,其中排除值 10。

Python random.uniform

random.uniform 函数生成 [x, y] 范围内的随机浮点数。

floats.py
#!/usr/bin/python

import random


val = random.uniform(1, 10)
print(val)

val = random.uniform(1, 10)
print(val)

val = random.uniform(1, 10)
print(val)

val = random.uniform(1, 10)
print(val)

该示例生成四个介于数字 1 和 10 之间的随机浮点数。

$ ./floats.py 
9.594596536362012
5.832673168195081
6.7942727933257
7.035310921661894

Python random.choice

random.choice 函数从非空序列返回一个随机元素。

rand_choice.py
#!/usr/bin/python

import random


words = ['sky', 'storm', 'rock', 'falcon', 'forest']


val = random.choice(words)
print(val)

val = random.choice(words)
print(val)

val = random.choice(words)
print(val)

val = random.choice(words)
print(val)

该示例从列表中随机选择一个单词四次。

$ ./rand_choice.py 
forest
forest
sky
storm

Python random.shuffle

random.shuffle 函数就地打乱序列。

shuffling.py
#!/usr/bin/python

import random


words = ['sky', 'storm', 'rock', 'falcon', 'forest']


random.shuffle(words)
print(words)

random.shuffle(words)
print(words)

该示例两次打乱单词列表。

$ ./shuffling.py 
['storm', 'falcon', 'rock', 'sky', 'forest']
['falcon', 'storm', 'rock', 'forest', 'sky']

Python random.sample

random.sample 允许从序列中选取 n 个唯一元素的随机样本。

sampling.py
#!/usr/bin/python

import random


words = ['sky', 'storm', 'rock', 'falcon', 'forest']


sample = random.sample(words, 3)
print(sample)

sample = random.sample(words, 3)
print(sample)

该示例两次从单词列表中随机选取三个元素。

$ ./sampling.py 
['rock', 'storm', 'falcon']
['forest', 'sky', 'rock']

Python secrets

secrets 模块用于生成密码学上强大的随机数,适用于管理密码、帐户身份验证或安全令牌等数据。

strong.py
#!/usr/bin/python

import secrets
import string


print(secrets.token_hex(12))
print(secrets.token_urlsafe(12))

alphabet = string.ascii_letters + string.digits
password = ''.join(secrets.choice(alphabet) for i in range(8))

print(password)

token_hex 函数以十六进制形式返回一个随机文本字符串。 token_urlsafe 函数返回一个随机的 URL 安全文本字符串。

alphabet = string.ascii_letters + string.digits
password = ''.join(secrets.choice(alphabet) for i in range(8))

这里我们生成一个八个字符的字母数字密码。

$ ./strong.py 
69e6919fc04cbd6f9f5a25dc
eLL8-yT4cictksh8
YbpPzXvt

来源

random — 生成伪随机数

在本文中,我们使用了 Python random 模块。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程