八丶随机数
8.1 随机数介绍
概念:在Python中,生成随机数可以通过random模块完成。这个模块提供了许多函数来生成各种类型的随机数,包括整数、浮点数、以及从序列中随机选择元素。下面是一些常用的random模块的函数及其用法:
8.1.1 random.seed()
概念:random.seed(a=None, version=2) 是 random 模块中的一个方法,用于初始化随机数生成器。通过设置种子,可以控制随机数生成器的初始状态,使得生成的随机数序列可以被复现。具体解释如下:
import random
random.seed(42, version=1)
print(random.random()) # 每次运行结果相同,但与version=2的结果不同
参数说明:
- a:种子值,可以是任意可哈希对象。如果未提供或为 None,则使用当前系统时间或系统状态作为种子。
- version:指定种子的版本。Python 3.2 之后添加了 version 参数。
- version=2(默认):使用较新的种子生成算法,基于二进制数据生成种子。
- version=1:使用较旧的种子生成算法,兼容早期版本的Python。
8.1.2 random.random()
概念:在 Python 中,random.random() 是一个用于生成随机浮点数的函数。它会返回一个范围在 [0.0,1.0)之间的随机浮点数,即大于等于 0.0 并且小于 1.0。
import random
# 生成一个随机浮点数
random_number = random.random()
print(random_number)
8.1.3 random.uniform()
概念:random.uniform(a, b) 函数用于生成一个在 [a, b] 范围内的随机浮点数。如果 a 大于 b,则 uniform 会在 [b, a] 范围内生成一个随机浮点数。
import random
# 生成一个在 [1.0, 10.0] 范围内的随机浮点数
random_float_1 = random.uniform(1.0, 10.0)
print(random_float_1)
# 生成一个在 [-5.0, 5.0] 范围内的随机浮点数
random_float_2 = random.uniform(-5.0, 5.0)
print(random_float_2)
# 生成一个在 [10.0, 1.0] 范围内的随机浮点数(相当于 [1.0, 10.0])
random_float_3 = random.uniform(10.0, 1.0)
print(random_float_3)
参数详细说明:
- a (number): 生成随机数的下界,可以是整数或浮点数。如果 a 大于 b,它将成为上界。
- b (number): 生成随机数的上界,可以是整数或浮点数。如果 b 小于 a, 它将成为下界。
8.1.4 random.randint()
概念:random.randint(a, b) 函数用于生成一个在 [a, b] 范围内的随机整数。它包括了 a 和 b 这两个端点值。这个函数的两个参数都是整数。
import random
# 生成一个在 [1, 10] 范围内的随机整数
random_int_1 = random.randint(1, 10)
print(f"随机整数在 [1, 10]: {random_int_1}")
# 生成一个在 [-5, 5] 范围内的随机整数
random_int_2 = random.randint(-5, 5)
print(f"随机整数在 [-5, 5]: {random_int_2}")
# 生成一个在 [0, 0] 范围内的随机整数(结果只能是 0)
random_int_3 = random.randint(0, 0)
print(f"随机整数在 [0, 0]: {random_int_3}")
参数说明:
- a (int): 生成随机整数的下界(包括在内)。
- b (int): 生成随机整数的上界(包括在内)。
8.1.5 random.randrange()
概念:random.randrange(start, stop[, step]) 是 Python 中用于生成指定范围内随机整数的函数。
random.randrange(start, stop[, step])
参数说明:
- start:范围的起始值(包含在内)。
- stop:范围的结束值(不包含在内)。
- step(可选):值之间的步长。默认为1
# 基本用法
import random
# 生成一个在范围 [0, 10) 内的随机整数
num = random.randrange(0, 10)
print(num)
# 指定步长
import random
# 生成一个在范围 [0, 10) 内、步长为2的随机整数
num = random.randrange(0, 10, 2)
print(num)
# 使用负数范围和步长
import random
# 生成一个在范围 [-10, -1) 内、步长为-2的随机整数
num = random.randrange(-10, -1, -2)
print(num)
注意事项:
- 如果未指定 step,默认为1。
- stop 参数是不包含在范围内的,即生成的随机整数不会等于 stop。
- 如果 start 等于 stop,会引发 ValueError,因为在这个范围内无法生成有效的整数。
8.1.6 random.choice()
概念:random.choice(seq) 是 Python 中用于从非空序列 seq 中随机选择一个元素的函数。
random.choice(seq)
参数说明:
- seq:表示一个非空的序列,可以是列表、元组或其他可迭代对象。
# 使用列表
import random
# 从列表中随机选择一个元素
my_list = ['apple', 'banana', 'cherry', 'date']
chosen_fruit = random.choice(my_list)
print(chosen_fruit)
# 使用元组
import random
# 从元组中随机选择一个元素
my_tuple = ('apple', 'banana', 'cherry', 'date')
chosen_fruit = random.choice(my_tuple)
print(chosen_fruit)
``注意事项:```
- 如果 seq 是空序列(即没有元素),则会引发 IndexError 异常。
- random.choice() 函数适用于需要从一个集合中随机挑选一个元素的情况,比如随机选取一个单词、随机选择一个答案等等。
8.1.7 random.choices()
概念:random.choices(population, weights=None, *, cum_weights=None, k=1) 是 Python 中用于从指定的总体(population)中以指定权重进行有放回抽样的函数
random.choices(population, weights=None, *, cum_weights=None, k=1)
参数说明:
- population:表示总体,可以是一个序列(如列表或元组),包含了可以被选择的元素。
- weights:是一个可选参数,用于指定每个元素被选择的概率。如果未指定,则所有元素被视为具有相等的概率。
- cum_weights:也是一个可选参数,与 weights 相同,但它是累积权重(cumulative weights),这意味着每个元素的选择概率是由其在累积权重列表中的值决定的。如果同时指定了 weights 和 cum_weights,则会引发 TypeError 异常。
- k:表示要返回的元素个数(即抽样次数),默认值为 1。
# 使用默认权重进行抽样
import random
# 从列表中随机选择一个元素,每个元素的选择概率相等
population = ['apple', 'banana', 'cherry', 'date']
chosen_fruit = random.choices(population)
print(chosen_fruit)
# 使用权重进行抽样
import random
# 从列表中随机选择一个元素,每个元素的选择概率不同
population = ['apple', 'banana', 'cherry', 'date']
weights = [0.1, 0.2, 0.3, 0.4] # 对应每个元素的选择概率
chosen_fruit = random.choices(population, weights, k=2)
print(chosen_fruit)
# 使用累计权重进行抽样
import random
# 从列表中随机选择一个元素,使用累积权重
population = ['apple', 'banana', 'cherry', 'date']
cum_weights = [0.1, 0.3, 0.6, 1.0] # 对应每个元素的累积选择概率
chosen_fruit = random.choices(population, cum_weights=cum_weights, k=3)
print(chosen_fruit)
注意事项:
- 如果同时指定了 weights 和 cum_weights,会引发 TypeError 异常。
- 如果 population 是空序列且未提供 weights 或 cum_weights,会引发 IndexError 异常。
- random.choices() 函数适用于需要根据指定的概率从总体中进行多次有放回抽样的情况。
8.1.8 random.sample()
概念:random.sample(population, k) 是 Python 中用于从总体(population)中无放回地抽取指定数量(k)的唯一元素的函数。
random.sample(population, k)
参数说明:
- population:表示总体,可以是一个序列(如列表或元组),包含了可以被选择的元素。
- k:表示要抽取的唯一元素的数量
# 从列表中抽取唯一元素
import random
# 从列表中无放回地抽取3个唯一的元素
my_list = ['apple', 'banana', 'cherry', 'date']
chosen_fruits = random.sample(my_list, 3)
print(chosen_fruits)
# 从元组中抽取唯一元素
import random
# 从元组中无放回地抽取2个唯一的元素
my_tuple = ('apple', 'banana', 'cherry', 'date')
chosen_fruits = random.sample(my_tuple, 2)
print(chosen_fruits)
注意事项:
- 如果 k 大于总体的长度(即 len(population)),会引发 ValueError 异常。
- 如果 population 是空序列且 k 大于0,会引发 ValueError 异常。
- random.sample() 函数适用于需要从总体中无放回地抽取一定数量的唯一元素的情况。
8.1.9 random.shuffle()
概念:random.shuffle(x[, random]) 是 Python 中用于将序列 x 中的元素随机排序的函数。
random.shuffle(x[, random])
参数说明:
- x:表示要随机排序的可变序列,可以是列表(list)。
- random:是一个可选的随机数生成器函数(如 random.random),用于指定自定义的随机数生成器。默认情况下,使用 random.random。
import random
# 定义一个列表
my_list = [1, 2, 3, 4, 5]
# 将列表元素随机打乱顺序
random.shuffle(my_list)
# 打印打乱后的列表
print(my_list)
注意事项:
- random.shuffle() 直接修改了原始列表 x,并且不返回任何值(返回值为 None)。
- 如果 x 是一个不可变序列(如元组),会引发 TypeError 异常,因为不可变序列无法进行就地修改。
- 如果指定了 random 参数,它必须是一个可调用的对象,返回一个随机浮点数,用于控制随机化过程。
8.1.10 random.gauss()
概念:random.gauss(mu, sigma) 是 Python 中用于生成一个服从高斯分布(正态分布)的随机数的函数。
random.gauss(mu, sigma)
参数说明:
- mu:是高斯分布的均值(mean)。
- sigma:是高斯分布的标准差(standard deviation)。
import random
# 生成一个均值为 0,标准差为 1 的随机数
random_number = random.gauss(0, 1)
print(random_number)
特点:
- 高斯分布也称为正态分布,它是统计学中最常见的分布之一。
- 均值 mu 决定了分布的中心位置,标准差 sigma 决定了分布的宽度或者说分散程度。
注意事项:
- mu 和 sigma 必须是非负数,否则会引发 ValueError 异常。
- 生成的随机数可能会超出指定均值和标准差的范围,因为高斯分布是连续分布。
8.2 随机点名案例
import random
import turtle as t
import time
# 创建海龟画布
screen = t.Screen()
screen.title("随机点名示例")
t.hideturtle()
# 创建海龟对象
t.speed(0.05) # 设置绘制速度
# 假设这是一个班级的学生名单
students = ['Alice', 'Bob', 'Carol', 'David', 'Eve', 'Frank', 'Grace']
num = random.randint(50, 100)
for i in range(num):
t.clear()
name = students[random.randint(0,len(students) -1)]
t.write(name, align="center", font=("Arial", 50))
time.sleep(0.05)
t.done()
8.3 随机验证码
import turtle
import random
import string
# 设置画布
screen = turtle.Screen()
screen.title("简易验证码")
screen.bgcolor("white")
screen.setup(width=400, height=200)
# 创建海龟对象
t = turtle.Turtle()
t.speed(0) # 设置海龟速度为最快
t.hideturtle()
# 定义验证码字符集
characters = string.ascii_letters + string.digits
def generate_code(length=5):
"""生成随机验证码字符串"""
return ''.join(random.choice(characters) for _ in range(length))
def draw_code(code):
"""在画布上绘制验证码"""
t.penup()
t.goto(-150, 50)
t.pendown()
for char in code:
t.penup()
t.goto(random.randint(-150, 150), random.randint(-50, 50))
t.write(char, font=("Arial", 24, "bold"))
# 生成验证码
code = generate_code()
# 绘制验证码和噪点
draw_code(code)
# 退出程序的函数
def close_program(x, y):
screen.bye()
# 绑定点击事件,点击画布关闭程序
screen.onclick(close_program)
# 保持画布显示
turtle.done()