python进阶系列 - 11 python随机数

763 阅读3分钟

Python中定义了一组用于生成或修改随机数的函数。

本文主要分享python中常用的随机模块:

  • random 模块
  • random.seed() 函数
  • secrets 模块
  • numpy.random 函数

random 模块

这个模块实现了各种分布的伪随机数生成器。 它使用 Mersenne Twister 算法作为其基础生成器。 本质上是一个伪随机数生成器,因为它的数字看起来随机,但是可以重复。

运行下面代码:

import random

a = random.random()  # 取0到1之间的随机浮点数(0.0 <= a < 1.0)
print(a)

a = random.uniform(1, 10)  # 取1到10之间的随机浮点数(1.0 <= a < 10.0 )
print(a)
a = random.randint(1, 10)  # 取1到10之间的随机整数(1 <= a <= 10)
print(a)
a = random.randrange(1, 10)  # 取1到10之间的随机整数(1 <= a <= 10)
print(a)
a = random.normalvariate(0, 1)  # 设置平均值为0,标准差为1的正态分布随机数
print(a)
a = random.choice(list("ABCDEFGHI"))  # 从序列中随机选择一个元素
print(a)
a = random.sample(list("ABCDEFGHI"), 3)  # 从序列中随机选择3个元素,不重复
print(a)
a = random.choices(list("ABCDEFGHI"), k=3)  # 从序列中随机选择3个元素,可以重复
print(a)
a = list("ABCDEFGHI")  # 打乱序列
random.shuffle(a)
print(a)

结果:

0.07673503583282937
2.079761431262405
8
6
0.7238775020583469
I
['E', 'B', 'H']
['B', 'F', 'F']
['C', 'H', 'A', 'I', 'F', 'B', 'D', 'E', 'G']

上面的代码每次运行时,生成的随机数都不一样。 为什么?因为随机数生成器是一个算法,它的结果是不确定的。 有办法让它确定的吗?下面的内容是解决这个问题的。

种子生成器

使用 random.seed() 函数,可以使得结果可重复,即在调用 random.seed() 后的函数调用链,会产生相同的数据。

这个种子值是一个整数,它的值决定了后续随机数序列的结果,一旦确定种子,也就无所谓随机了😀。

练习下面代码:

import random

print("设种子值为1:")
random.seed(1)
print(random.random())
print(random.uniform(1, 10))
print(random.choice(list("ABCDEFGHI")))

print("\n设置种子值为42:")
random.seed(42)
print(random.random())
print(random.uniform(1, 10))
print(random.choice(list("ABCDEFGHI")))

print("\n重新设置种子值为1:")
random.seed(1)
print(random.random())
print(random.uniform(1, 10))
print(random.choice(list("ABCDEFGHI")))

print("\n重新设置种子值为42:")
random.seed(42)
print(random.random())
print(random.uniform(1, 10))
print(random.choice(list("ABCDEFGHI")))

结果:

设种子值为1:
0.13436424411240122
8.626903632435095
B

设置种子值为42:
0.6394267984578837
1.2250967970040025
E

重新设置种子值为1:
0.13436424411240122
8.626903632435095
B

重新设置种子值为42:
0.6394267984578837
1.2250967970040025
E

通过示例输出可以看到,所谓的随机高度依赖设置的随机种子数。如果随机种子数确定,其实也就没有所谓的随机数了。惊不惊喜!

secrets 模块

secrets 模块提供了一个生成随机数的方法,可以用来生成密码、身份认证、安全令牌等。 特别的,secrets应该优先于默认的随机数生成器,但它常用来模拟随机模型,而不是加密和安全。

练习下面代码:

import secrets

a = secrets.randbelow(10)  # 随机一个10以内的数。
print(a)

a = secrets.randbits(5)  # 随机一个5位的二进制数。
print(a)

a = secrets.choice(list("ABCDEFGHI"))  # 从一个序列中随机选择一个元素。
print(a)

跟上面相同的原理,每次结果是不同的。

7
29
D

使用NumPy生成随机数

numpy伪随机数生成器与python标准库使用伪随机数生成器不同。 区别点,Python伪随机数设定种子值并不会影响NumPy伪随机数生成器。 numpy的种子需要单独设置。

练习下面代码:

import numpy as np

np.random.seed(1)
print(np.random.rand(3))  # 产生3个随机数
np.random.seed(1)
print(np.random.rand(3))  # 产生3个随机数
values = np.random.randint(0, 10, (5, 3))  # 产生5行3列的随机整数
print(values)
values = np.random.randn(5)  # 产生5个随机数,均值为0,标准差为1,服从标准正态分布
print(values)
# randomly shuffle a nd array.
# only shuffles the array along the first axis of a multi-dimensional array
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])  #
np.random.shuffle(arr)
print(arr)

结果:

[4.17022005e-01 7.20324493e-01 1.14374817e-04]
[4.17022005e-01 7.20324493e-01 1.14374817e-04]
[[5 0 0]
 [1 7 6]
 [9 2 4]
 [5 2 4]
 [2 4 7]]
[-2.29230928 -1.41555249  0.8858294   0.63190187  0.04026035]
[[4 5 6]
 [7 8 9]
 [1 2 3]]

小节

本文简要分享了Python中常用的随机库,如randomsecrets等。

感谢你的阅读。欢迎大家点赞、收藏、支持!

pythontip 出品,Happy Coding!

公众号: 夸克编程

我们的小目标: 让天下木有难学的Python!