随机化入门
日常生活中充斥着各种随机现象。天气变化就是典型的随机过程:虽然可以进行预测,但准确度始终有限。放射性衰变同样是缺乏规律性和可预测性的随机过程。与按照预设程序运行的确定性计算机不同,自然界无需任何编程、条件判断或循环控制,事物以最随机且不可预测的方式发生。这种不可预测性在计算机和应用程序(如游戏)中也常常需要。
游戏中的随机性和不可预测性能避免预设场景和可预测挑战带来的单调感。在模拟现实场景、测试算法或生成样本数据集时,随机元素同样不可或缺。

摄影:Wolfgang Hasselmann 发布于 Unsplash
在编程语言中,随机化指在计算机输出中引入不可预测性和变异性。程序通过随机数生成实现随机性。
生成伪随机数的方法多样。Python的random模块使用梅森旋转算法实现随机性。虽然作为伪随机数生成器被广泛使用,但梅森旋转算法具有确定性特性,因此在安全性优先的任务中存在风险。编程中生成完全随机数较为困难,通常采用伪随机数生成方案,虽然通过设定种子值可以重现序列。
本文将探讨如何运用Python随机模块在代码输出中实现随机化。
Python随机模块详解
现在深入探讨random模块。该模块通过梅森素数实现梅森旋转算法生成随机性。这个Python内置模块支持以多种方式在代码中生成随机性,并在处理不同数据类型时提供灵活性。通过示例理解其功能。可通过以下链接访问官方文档:
使用random模块前需要先导入:
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 = ["苹果", "香蕉", "樱桃", "草莓"]
print(random.choices(mylist, weights = [2, 1, 1, 1,], k = 8))

上述代码输出结果(作者供图)
代码中将mylist作为输入序列传递给choice()函数,同时设置各项权重及输出列表长度。注意因权重增加而频繁出现的“苹果”。
随机打乱列表项
使用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)。
种子值
seed()函数是Python随机模块的特色功能。种子值作为随机数生成的起点,是实现可重现性和模式追踪的重要特性。使用随机值生成随机数时,实际是从随机种子值生成,但也可以通过seed()函数自定义种子值。
random.seed(22)
random_number = random.randrange(0,10,2)
print(random_number)
此代码将因设定种子值22而始终生成随机数“2”。若将种子值改为55,则会重复生成“0”。
随机模块应用场景
虽然随机模块包含更多功能和实现方式,但上述函数最为常用。Python随机模块可应用于多种场景,主要集中在游戏和现实模拟中。如前述的骰子游戏、抛硬币游戏,甚至随机密码生成器。结合条件判断和循环,还能实现石头剪刀布游戏的模拟。

