如何使用-Python-随机模块实现随机化
如何使用 Python 随机模块实现随机化
原文:
towardsdatascience.com/implementing-randomisation-with-the-python-random-module/
随机化简介
在我们的日常生活中,我们会遇到许多完全随机不同的现象。天气是随机的:当然,我们可以预测和预测天气,但只能达到一定程度。放射性衰变也是一个有趣的随机过程,缺乏模式和可预测性。与按照编程方式运行的确定性计算机不同,自然界不需要任何编程、条件或循环。事情以最随机和不可预测的方式发生,这就是我们在计算机和应用程序(如游戏)中也需要的这种不可预测性。
在我们玩的游戏中,我们需要随机性和不可预测性,这样我们才不会对预编程的场景和可预测的挑战感到厌倦。我们还需要在模拟现实场景、测试算法或生成样本数据集中包含随机性元素。

图片由 Wolfgang Hasselmann 在 Unsplash 提供
在编程语言中,随机化指的是在计算机输出中引入不可预测性和可变性。随机性是通过程序中的随机数生成的。
生成伪随机数有多种方法。Python 使用梅森旋转器在其随机模块中实现随机性。虽然广泛用作伪随机数生成器(PRNG),但梅森旋转器具有确定性属性,使其在某些以安全性为首要任务的任务中不安全。在编程中,生成完全随机的数字相当困难,所以我们利用生成伪随机数的概念,尽管如果给定一个种子值,它们是可重复的,如以下所示。
在本文中,我们将通过使用 Python 随机模块来生成代码输出的随机性来探讨随机化的概念。
Python 随机模块
现在,让我们深入探讨随机模块。首先,我们知道这个模块中的随机性是通过梅森旋转器使用梅森素数生成的。这个 Python 的内置模块允许我们以多种方式在我们的代码中生成随机性,并在我们处理不同数据类型时提供灵活性。让我们通过示例来了解其功能。您可以通过以下链接访问该模块的官方文档:
random — 生成伪随机数(random — Generate pseudo-random numbers)
为了使用随机模块,我们需要确保首先在我们的代码中导入它:
import random
在 0 和 1 之间生成随机浮点值
我们将学习的第一个任务是生成一个介于 0 和 1 之间的随机值,其中 0 是不包含的,1 是包含的。这可以通过random()函数完成。
random_value = random.random()
print(random_value)
上述代码将生成一个介于 0 和 1 之间的随机浮点值。如果您多次运行上述代码,每次的值都将不同。
在指定范围内生成随机浮点值
我们可以使用随机模块的uniform()函数来生成特定范围内的随机数。
random_value = random.uniform(1,10)
print(random_value)
多次运行上述代码将输出括号中提到的范围内的数字。
在特定范围内生成随机整数
假设我们想要一个类似在许多游戏中需要的骰子随机值,我们可以使用randint()函数将此功能包含在我们的代码中。此函数输出一个随机整数,与上述函数不同,它输出一个浮点值。
random_value = random.randint(1,6)
print(random_value)
注意,运行上述代码片段时,生成的随机值将包括 1 和 6。

图片由Aakash Dhage在Unsplash提供
从值列表中获取随机值
接下来,我们将看到如何从值列表中生成一个随机值。我们可以通过首先定义一个 Python 项目列表,然后使用随机值函数的choice()来输出列表中的一个随机项目。
为了这个目的,我们首先创建一个列表,然后使用随机模块的choice()函数从该列表中随机选择一个项目。假设我们有一份我们的猫的列表,我们必须从中选择一只来给予特殊待遇。以下是这样做的方法:
my_cats = ["Jerry", "Tom", "Figaro", "Bella", "Simba"]
cat_chosen = random.choice(my_cats)
print(cat_chosen)
注意,上述代码是随机的,这意味着并不一定所有猫都会被选中(尽管随着代码的运行概率非常高),所以,这并不是一个公平的选择方式来决定给谁特殊待遇!
此外,我们还可以使用choices()函数创建一个随机选择列表。此函数还允许我们决定列表中每个项目的权重,这意味着我们可以增加列表中任何项目被随机选中的概率:
mylist = ["apple", "banana", "cherry", "strawberry"]
print(random.choices(mylist, weights = [2, 1, 1, 1,], k = 8))

上述代码的输出(图片由作者提供)
在上述代码中,我们已将 mylist 作为输入序列传递给choice()函数,以及列表中每个项目的权重,以及我们想要生成的随机选择项目的输出列表的长度。注意由于“apple”的权重增加,其出现的次数。
随机打乱项目列表
接下来,我们将学习如何随机打乱列表中的项目。我们可以使用随机模块中的shuffle()函数来完成这个任务。
deck = list(range(1,53))
print(deck)
random.shuffle(deck)
print(deck)

打乱后的输出(图片由作者提供)

从列表中随机且唯一地抽取样本
假设我们想要为每位玩家抽取 5 张随机卡片。我们不能使用choice()函数,因为我们希望从牌堆中抽取独特的卡片,没有重复的卡片。我们将使用sample()函数来完成这个任务:
deck = list(range(1,53))
cards = random.sample(deck, 5)
print(cards)

上述代码的输出(图片由作者提供)
具有步长的特定范围内的随机整数
randrange()函数可以用来从指定范围内随机选择一个数字,其中起始值、结束值和步长都是定义好的。
random_number = random.randrange(0,10,2)
print(random_number)
上面的代码块将生成从 0 到 8 的数字,因为 10 是非包含的,我们已将 2 定义为步长。
种子值
Python 中随机模块的一个有趣特性是seed()函数。这个种子值被用作随机数生成的起点,是追踪可重复性和模式的主要特性。每次我们使用随机值来生成随机数时,它实际上是从一个随机种子值生成的,但我们可以通过seed()函数自己定义种子值。
random.seed(22)
random_number = random.randrange(0,10,2)
print(random_number)
由于定义了种子值‘22’,上述代码将始终生成随机数‘2’。如果我们给出种子值‘55’,它将反复生成‘0’。
随机模块的应用
虽然随机模块中有更多函数和许多实现方式,但上述函数是一些最常用的。Python 的随机模块可以用多种方式使用,主要是在游戏和现实世界的模拟中。我们可以使用随机模块在涉及掷骰子的游戏中,如上面所探讨的,在抛硬币游戏中,甚至作为随机密码生成器。我们还可以使用随机模块和一些条件语句和循环来模拟剪刀石头布游戏!

由Erik Mclean在Unsplash上的照片

浙公网安备 33010602011771号