3. 生成随机数组并设置种子

生成随机数组并设置种子 学习卡片

任务说明

本案例要求使用NumPy的np.random模块生成随机数组,并通过设置随机种子(seed)确保每次运行得到相同的结果。随机数在数据分析中常用于模拟数据、初始化参数或抽样,而可复现性是科学计算和工程实践的基本要求。

核心实现

以下代码演示了三种常用随机数组的生成方式:均匀分布、标准正态分布和随机整数数组。通过np.random.seed()固定随机数生成器的初始状态,使得多次执行脚本时输出完全一致。

import numpy as np

# 设置随机种子,保证结果可复现
np.random.seed(42)

# 1. 生成形状为 (3, 4) 的 [0, 1) 均匀分布随机数组
uniform_arr = np.random.rand(3, 4)
print("均匀分布随机数组 (3x4):")
print(uniform_arr)

# 2. 生成形状为 (2, 3) 的标准正态分布随机数组(均值0,标准差1)
normal_arr = np.random.randn(2, 3)
print("\n标准正态分布随机数组 (2x3):")
print(normal_arr)

# 3. 生成形状为 (5,) 的 [0, 10) 区间随机整数数组
int_arr = np.random.randint(0, 10, size=5)
print("\n随机整数数组 (5,):")
print(int_arr)

# 4. 验证:重新设置相同种子,再次生成应得到完全相同的数组
np.random.seed(42)
uniform_arr_again = np.random.rand(3, 4)
print("\n重新设置种子后再次生成的均匀分布数组:")
print(uniform_arr_again)
print("\n两次生成结果是否一致:", np.array_equal(uniform_arr, uniform_arr_again))

关键说明

  • np.random.seed(42)中的参数42是任意整数,只要种子相同,后续随机序列就相同。
  • np.random.rand(d0, d1, ...)生成[0, 1)区间均匀分布数组;np.random.randn(d0, d1, ...)生成标准正态分布数组;np.random.randint(low, high, size)生成[low, high)区间随机整数数组。
  • 种子设置必须位于所有随机生成调用之前,且每次需要复现时都要重新设置。

运行与验证

将上述代码保存为random_seed_demo.py,在已安装NumPy的Python环境中执行:

python random_seed_demo.py

判定标准:

  1. 程序正常输出四组数组,无报错。
  2. 第1步与第4步输出的均匀分布数组完全相同,且最后一行打印True。
  3. 再次运行脚本,所有输出与第一次运行完全一致,证明随机种子生效。

随机种子机制示意

seed(42) MT19937 状态 (确定性初始状态) rand() 均匀分布 randn() 正态分布 randint() 整数 再次调用 seed(42) → 状态重置 → 生成完全相同的序列 np.array_equal() 验证两次输出一致 → 返回 True

预期输出

由于设置了固定种子42,每次运行脚本都会得到以下完全相同的输出(以NumPy 1.x版本为准):

均匀分布随机数组 (3x4):
[[0.37454012 0.95071431 0.73199394 0.59865848]
 [0.15601864 0.15599452 0.05808361 0.86617615]
 [0.60111501 0.70807258 0.02058449 0.96990985]]

标准正态分布随机数组 (2x3):
[[ 0.95008842 -0.15135721 -0.10321885]
 [ 0.4105985   0.14404357  1.45427351]]

随机整数数组 (5,):
[6 3 7 4 6]

重新设置种子后再次生成的均匀分布数组:
[[0.37454012 0.95071431 0.73199394 0.59865848]
 [0.15601864 0.15599452 0.05808361 0.86617615]
 [0.60111501 0.70807258 0.02058449 0.96990985]]

两次生成结果是否一致: True

以上输出为确定性结果,由种子42唯一决定。若更换种子值,输出将随之改变,但同一种子下的输出始终保持一致。