Python random 模块
最后修改于 2024 年 1 月 29 日
Python random 模块教程展示了如何在 Python 中生成伪随机数。
随机数生成器
随机数生成器 (RNG) 生成一组值,这些值在外观上不显示任何可区分的模式。随机数生成器分为两类:硬件随机数生成器和伪随机数生成器。硬件随机数生成器被认为可以生成真正的随机数。伪随机数生成器基于软件算法生成值。它们生成看起来随机的值。但是这些值是确定性的,如果知道算法,就可以重现。
在计算中,随机生成器用于赌博、游戏、模拟或密码学。
为了提高伪随机数生成器的质量,操作系统使用从设备驱动程序、用户输入延迟或来自一个或多个硬件组件的抖动收集的环境噪声。这是密码学上安全的伪随机数生成器的核心。
Python random 模块
内置的 Python random 模块实现了用于各种分布的伪随机数生成器。 Python 使用 Mersenne Twister 算法来生成其伪随机数。 此模块不适合安全性。 对于安全相关的任务,建议使用 secrets 模块。
种子
种子是初始化随机数生成器的值。 随机数生成器通过对先前的值执行某些操作来生成值。 当算法启动时,种子是生成器运行的初始值。 生成器最重要和最困难的部分是提供一个接近真正随机数的种子。
在 Python 中,种子值由 random.seed 函数提供。 如果未明确给出该值,Python 将使用系统时钟或其他随机源。
Python 随机数 - 相同的种子
在下面的示例中,我们使用相同的种子。
#!/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] 范围内的整数。
#!/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) 之间的值。
#!/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] 范围内的随机浮点数。
#!/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 函数从非空序列返回一个随机元素。
#!/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 函数就地打乱序列。
#!/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 个唯一元素的随机样本。
#!/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 模块用于生成密码学上强大的随机数,适用于管理密码、帐户身份验证或安全令牌等数据。
#!/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
来源
在本文中,我们使用了 Python random 模块。
作者
列出所有 Python 教程。