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中常用的随机库,如random
、secrets
等。
感谢你的阅读。欢迎大家点赞、收藏、支持!
pythontip 出品,Happy Coding!
公众号: 夸克编程
我们的小目标: 让天下木有难学的Python!