在编程领域,生成随机数是一项基本技能,它在游戏、模拟、可视化技术和数据分析等多种应用中发挥着重要作用。Python语言以其强大的标准库,提供了多种生成随机数的方法,本文将详细探讨这些方法,并特别关注Python内置的random模块。通过阅读本文,将了解如何在Python项目中使用随机数。
理解编程中的随机性概念。
利用Python的random模块生成不同类型的随机数。
在实际场景如模拟和游戏中应用随机数生成。
在Python中生成随机数是一个简单的过程,它应该成为每个程序员技能库的一部分,因为它将在未来的项目中提供帮助,无论是游戏、模拟、可视化技术还是数据分析。random模块是一个标准的Python库,包含一组函数,用于生成随机整数或浮点数,或从序列(如列表)中选择元素。通过使用random模块中的randint()生成随机整数,使用uniform()在范围内生成浮点数,以及使用choice()随机选择序列中的元素,开发者可以设计出复杂且随机的应用,为用户带来激动人心的体验,同时也能够模拟现实世界。
注意:不要使用random模块生成用于安全目的的随机数。对于安全和加密用途,可以使用secrets模块,该模块使用真正的随机数生成器(TRNG)。
random模块有一个种子,它帮助随机数生成器开始工作。这个种子值用于生成所谓的确定性随机数序列,即当使用相同的种子数字时,程序将产生相同的连续随机数序列。这些被称为伪随机数。
让通过一个例子来理解它:
import random
print('随机数1=>', random.random())
print('随机数2=>', random.random())
在这里,使用了random()函数,它在[0.0, 1.0]范围内生成一个随机数。注意,没有提到种子值。默认情况下,当前系统时间的毫秒数被用作种子。让看看输出。
由于执行过程中时间的变化,这两个数字是不同的。让看看如果用相同的值对生成器进行种子设置会发生什么:
random.seed(42)
print('随机数1=>', random.random())
random.seed(42)
print('随机数2=>', random.random())
在这里得到了相同的数字。这就是为什么伪随机数生成器是确定性的,并且不用于安全目的,因为任何拥有种子的人都可以生成相同的随机数。
到目前为止,知道如何在[0.0, 1.0]范围内创建随机数。但如果需要在其他范围内创建数字呢?
一种方法是将数字乘以并加到random()函数返回的数字上。例如,random.random() * 3 + 2将返回[2.0, 5.0]范围内的数字。然而,这更像是一个变通方法,而不是直接的解决方案。
不用担心!random模块在这里为提供了支持。它提供了uniform()和randint()函数,可以使用这些函数来实现这一目的。让一一了解它们。
uniform()函数接受一个范围的起始和结束值作为参数,并返回一个在[起始,结束]范围内的浮点随机数:
print('在范围(2,8)内的随机数=>', random.uniform(2,8))
randint()函数与uniform()函数类似。唯一的区别是uniform()函数返回浮点随机数,而randint()函数返回整数。它也返回在[起始,结束]范围内的数字:
print('在范围(2,8)内的随机数=>', random.randint(2,8))
choice()和choices()是random模块提供的两个函数,可以使用它们从列表中随机选择值。这两个函数都接受一个列表作为参数,并从中随机选择一个或多个值。能猜出choice()和choices()之间的区别吗?
choice()只从列表中选择单个值,而choices()可以从列表中选择多个值,并允许替换。这些函数的一个很棒的功能是它们也可以在包含字符串的列表上工作。让看看它们在行动中的样子:
a = [5, 9, 20, 10, 2, 8]
print('随机选择的数字=>', random.choice(a))
print('随机选择的数字=>', random.choices(a, k=3))
如所见,choice()从a中返回了一个单个值,而choices()从a中返回了三个值。在这里,k是choices()返回的列表的长度。
可以注意到choices()返回的响应中每个值只出现一次。可以通过将数组作为weights传递给choices()函数来增加每个值被选择的概率。那么,让将10的概率增加到其他值的三倍,并看看结果:
for _ in range(5):
print('随机选择的数字=>', random.choices(a, weights=[1,1,1,3,1,1], k=3))
在这里,可以看到10在从列表中每次抽取时都出现了。random模块中还有一个sample()函数,它与choices()函数类似,但是从列表中随机抽取样本,不允许替换。
假设不想从列表中选择值,而只是想重新排序它们。可以使用random模块中的shuffle()函数来实现这一点。这个shuffle()函数接受一个列表作为参数,并就地打乱列表:
print('原始列表=>', a)
random.shuffle(a)
print('打乱后的列表=>', a)
注意:shuffle()函数不返回列表。
random模块的另一个惊人特性是它允许根据不同的概率分布生成随机数。有各种函数如gauss()、expovariate()等,可以帮助做到这一点。
如果不熟悉概率分布,那么强烈建议阅读这篇文章:《每个数据科学专业人士都应该知道的6种常见概率分布》。
gauss()函数用于生成正态分布的随机数。它接受均值和标准差作为参数,并返回一个随机数:
for _ in range(5):
print(random.gauss(0,1))
在这里,为均值等于0和标准差为1的gauss()函数绘制了1000个随机数。可以看到上面的所有点都围绕均值分布,并且它们没有广泛分布,因为标准差是1。
expovariate()函数用于获取按照指数分布的随机数。它接受lambda值作为参数,并返回一个从0到正无穷大的值(如果lambda为正),或从负无穷大到0的值(如果lambda为负):
print('来自指数分布的随机数=>', random.expovariate(10))
使用Python生成随机数是简单且必要的,特别是在计算和游戏等领域的应用中。random模块为生成随机整数、浮点数和随机选择列表元素提供了广泛的可能性。了解如何对随机数生成器进行种子设置以及如何应用各种形式的随机数生成将有助于编程创建生动的应用。
Python中的random模块对于生成随机数和选择至关重要。
像randint()、uniform()和choice()这样的函数简化了创建随机值的过程。
种子设置允许可重现的随机序列,这对于测试和调试非常有用。
Q1. choice()和choices()之间有什么区别?
A. choice()从列表中返回单个随机元素,而choices()可以返回多个元素,并允许替换。