【Python】随机数种子(random seed)的设置

随机数种子的讲解:原理、应用与实例

在编程中,随机数是一项非常重要的功能,广泛应用于科学计算、数据处理、机器学习以及游戏开发等领域。然而,随机数并不是真正的“随机”,而是通过特定的算法生成的“伪随机数”(Pseudo Random Number)。为了让程序在特定情况下产生一致的随机数,我们可以使用**随机数种子(Random Seed)**来控制随机数的生成过程。本文将深入讲解随机数种子的概念、原理及其应用,并通过实例演示如何设置随机数种子。


一、什么是随机数种子?

随机数种子(Seed)是伪随机数生成器的初始值。伪随机数是通过特定算法生成的,它们看似随机,但实际上是确定性的。如果伪随机数生成器的初始状态(种子)相同,那么每次生成的随机数序列也会完全相同。

简单来说,随机数种子是控制随机数生成的“开关”,设置种子后,程序中涉及随机数的行为变得“可控且可复现”。

为什么伪随机数是确定的?
  • 伪随机数由数学公式或算法生成。
  • 给定相同的输入条件(如种子值),算法会生成相同的输出随机数序列。
  • 因此,通过控制种子,我们可以控制随机行为,确保实验的可复现性。

二、随机数种子的作用

1. 保证结果的可复现性

在许多实验中,尤其是机器学习或科学研究中,结果的可复现性至关重要。如果每次运行程序都生成不同的随机数,调试和对比实验会变得非常困难。通过设置随机数种子,可以确保每次运行程序时,随机操作的结果一致。

2. 调试更加方便

在代码中,如果某些操作依赖随机性(如随机初始化神经网络权重、数据集随机分割等),未设置随机数种子可能会导致每次运行结果不一致。通过设置种子,可以让程序在每次运行时保持相同的随机数序列,从而便于发现和解决问题。

3. 控制随机行为

在游戏开发或模拟实验中,有时需要生成“看似随机”的行为,但同时希望在特定条件下重现这些行为。设置随机数种子可以满足这一需求。


三、如何设置随机数种子?

Python 提供了多种随机数生成器,其中常见的有:

  1. random 模块:标准库提供的随机数生成器,适用于简单场景。
  2. numpy 的随机模块:用于科学计算。
  3. 深度学习框架的随机模块(如 PyTorch 和 TensorFlow):用于控制训练过程中的随机性。

以下分别讲解它们的用法。


1. Python random 模块

random.seed() 用于设置随机数生成器的种子,确保每次运行生成相同的随机数序列。

示例:
import randomrandom.seed(42)  # 设置随机数种子
print(random.randint(1, 100))  # 输出固定,例如:81
print(random.random())         # 输出固定,例如:0.6394267984578837# 再次设置相同种子,结果相同
random.seed(42)
print(random.randint(1, 100))  # 输出仍然是:81
print(random.random())         # 输出仍然是:0.6394267984578837

总结:只要种子固定,random 模块生成的随机数序列就完全一致。


2. NumPy 的随机模块

NumPy 提供了更强大的随机数功能,同样可以通过 numpy.random.seed() 设置种子。

示例:
import numpy as npnp.random.seed(42)  # 设置随机数种子
print(np.random.rand(3))  # 输出固定,例如:[0.37454012 0.95071431 0.73199394]# 再次设置相同种子,结果相同
np.random.seed(42)
print(np.random.rand(3))  # 输出仍然是:[0.37454012 0.95071431 0.73199394]

3. PyTorch 的随机数种子

在深度学习中,随机性常用于神经网络权重初始化、数据增强等。PyTorch 提供了 torch.manual_seed() 来控制随机数的生成。

示例:
import torchtorch.manual_seed(42)  # 设置随机数种子
print(torch.randn(3))  # 输出固定,例如:tensor([ 0.3367,  0.1288,  0.2341])# 再次设置相同种子,结果相同
torch.manual_seed(42)
print(torch.randn(3))  # 输出仍然是:tensor([ 0.3367,  0.1288,  0.2341])

注意:如果使用 GPU,还需设置:

torch.cuda.manual_seed(42)
torch.cuda.manual_seed_all(42)

四、结合代码的完整示例

以下是一个完整示例,展示如何通过随机数种子控制随机行为的复现性:

import random
import numpy as np
import torch# 设置全局种子
manual_seed = random.randint(1, 10000)  # 随机生成一个种子
random.seed(manual_seed)                # 设置 Python 随机数种子
np.random.seed(manual_seed)             # 设置 NumPy 随机数种子
torch.manual_seed(manual_seed)          # 设置 PyTorch 随机数种子# 示例1:随机整数
print(random.randint(1, 100))  # 结果固定
print(np.random.rand(3))       # 结果固定
print(torch.randn(3))          # 结果固定# 示例2:使用相同种子生成一致结果
random.seed(manual_seed)
np.random.seed(manual_seed)
torch.manual_seed(manual_seed)print(random.randint(1, 100))  # 结果仍固定
print(np.random.rand(3))       # 结果仍固定
print(torch.randn(3))          # 结果仍固定

五、注意事项

  1. 种子值的范围:
    • 种子值通常为非负整数。过大的种子可能超出生成器的计算范围(如 32 位系统限制)。
  2. 影响范围:
    • random.seed() 仅影响 Python 的 random 模块,不会影响 NumPy 或 PyTorch 的随机数。
    • 要同时控制多个模块的随机性,需要分别设置种子。
  3. GPU 的随机性:
    • 使用 GPU 时,某些操作可能仍有不可控的随机性(如非确定性的 CUDA 算法),需要额外设置 torch.backends.cudnn.deterministic = True

六、总结

随机数种子的作用可以概括为以下几点:

  1. 控制随机行为:固定种子后,每次运行程序都会生成相同的随机数序列。
  2. 提高代码的可复现性:特别是在科学研究和机器学习任务中。
  3. 便于调试:可以让实验结果一致,方便定位问题。

无论是 Python 的 random 模块,NumPy 的随机模块,还是深度学习框架(如 PyTorch),都提供了种子设置功能。通过合理使用随机数种子,可以确保程序的行为更加稳定可靠。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/3703.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OSPF小实验

引言 在前面的博客中我们学习了ospf的基础理论知识与配置:ospf(2),相信大家对ospf已经有了一定的了解了,那么接下来我们就开始尝试做一个ospf的综合实验吧 实验拓扑 实验需求 r1-3为区域0,r3-r4为区域1&…

蓝桥杯刷题第二天——背包问题

题目描述 有N件物品和一个容量是V的背包。每件物品只能使用一次。第i件物品的体积是Vi价值是Wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入格式 第一行两个整数,N,V&am…

mono3d汇总

lidar坐标系 lidar坐标系可以简单归纳为标准lidar坐标系和nucense lidar坐标系&#xff0c;参考链接。这个坐标系和车辆的ego坐标系是一致的。 标准lidar坐标系 opendet3d&#xff0c;mmdetection3d和kitt都i使用了该坐标系 up z^ x front| /| /left y <------ 0kitti采…

接口防篡改+防重放攻击

接口防止重放攻击&#xff1a;重放攻击是指攻击者截获了一次有效请求(如交易请求),并在之后的时间里多次发送相同的请求&#xff0c;从而达到欺骗系统的目的。为了防止重放攻击&#xff0c;通常需要在系统中引入一种机制&#xff0c;使得每个请求都有一个唯一的标识符(如时间戳…

流程与管理篇:IPD核心思想与框架

关注作者 IPD是英文&#xff08;Integrated Product Development&#xff09;的写&#xff0c;中文 翻译为“集成产品开发”&#xff0c;它是一套产品开发的模式、理念与方法。 IPD整合了客户需求、市场分析和产品开发&#xff0c;建立了需求和产品之间的联系&#xff0c;开辟…

阿里云通义实验室自然语言处理方向负责人黄非:通义灵码2.0,迈入 Agentic AI

通义灵码是基于阿里巴巴通义大模型研发的AI 智能编码助手&#xff0c;在通义灵码 1.0 时代&#xff0c;我们针对代码的生成、补全和问答&#xff0c;通过高效果、低时延&#xff0c;研发出了国内最受欢迎的编码助手。 在通义灵码 2.0 发布会上&#xff0c;阿里云通义实验室自然…

记录 idea 启动 tomcat 控制台输出乱码问题解决

文章目录 问题现象解决排查过程 1. **检查 idea 编码设置**2. **检查 tomcat 配置**3.检查 idea 配置文件4.在 Help 菜单栏中&#xff0c;修改Custom VM Options完成后保存&#xff0c;并重启 idea 问题现象 运行 tomcat 后&#xff0c;控制台输出乱码 解决排查过程 1. 检查…

微透镜阵列精准全检,白光干涉3D自动量测方案提效70%

广泛应用的微透镜阵列 微透镜是一种常见的微光学元件&#xff0c;通过设计微透镜&#xff0c;可对入射光进行扩散、光束整形、光线均分、光学聚焦、集成成像等调制&#xff0c;进而实现许多传统光学元器件难以实现的特殊功能。 微透镜阵列&#xff08;Microlens Array&#x…

企业级NoSQL数据库Redis

1.浏览器缓存过期机制 1.1 最后修改时间 last-modified 浏览器缓存机制是优化网页加载速度和减少服务器负载的重要手段。以下是关于浏览器缓存过期机制、Last-Modified 和 ETag 的详细讲解&#xff1a; 一、Last-Modified 头部 定义&#xff1a;Last-Modified 表示服务器上资源…

金融项目实战 06|Python实现接口自动化——日志、实名认证和开户接口

目录 一、日志封装及应用&#xff08;理解&#xff09; 二、认证开户接口脚本编写 1、代码编写 1️⃣api目录 2️⃣script目录 2、BeautifulSoup库 1️⃣简介及例子 2️⃣提取html数据工具封装 3、认证开户参数化 一、日志封装及应用&#xff08;理解&#xff09; &…

Redis可视化工具--RedisDesktopManager的安装

需要安装使用&#xff0c;0.9.4以上是要收费的 下载地址&#xff1a;https://github.com/uglide/RedisDesktopManager/releases/download/0.9.3/redis-desktop-manager-0.9.3.817.exe 详情&#xff1a;https://blog.csdn.net/u012688704/article/details/82251338 点击进行安…

基于.Net Core+Vue的文件加密系统

1系统架构图 2 用例图 管理员角色的用例&#xff1a; 文件分享大厅&#xff1a;管理员可以访问文件分享大厅&#xff0c;下载文件。个人信息管理&#xff1a;管理员可以更新自己的个人信息&#xff0c;修改密码。用户管理&#xff1a;管理员负责创建、更新或删除用户账户&…

深入内核讲明白Android Binder【二】

深入内核讲明白Android Binder【二】 前言一、Binder通信内核源码整体思路概述1. 客户端向服务端发送数据流程概述1.1 binder_ref1.2 binder_node1.3 binder_proc1.4 binder_thread 2. 服务端的binder_node是什么时候被创建的呢&#xff1f;2.1 Binder驱动程序为服务创建binder…

Solidity01 Solidity极简入门

一、Solidity 简介 Solidity 是一种用于编写以太坊虚拟机&#xff08;EVM&#xff09;智能合约的编程语言。我认为掌握 Solidity 是参与链上项目的必备技能&#xff1a;区块链项目大部分是开源的&#xff0c;如果你能读懂代码&#xff0c;就可以规避很多亏钱项目。 Solidity …

LLM大语言模型的分类

从架构和功能的角度来看&#xff0c;LLM&#xff08;Large Language Model&#xff0c;大语言模型&#xff09;主要可以分为以下几种类型&#xff1a; **1. 基础语言模型&#xff1a;** * **定义:** 通过在大规模文本数据上进行预训练&#xff0c;学习语言的规律和模式&#…

JavaWeb简单开发

JavaWeb 开发是指基于 Java 技术栈进行 Web 应用开发的过程&#xff0c;主要依赖于 Java EE 或者 Spring 框架来构建服务器端应用。JavaWeb 的技术栈比较广泛&#xff0c;通常包括以下几个部分&#xff1a; 示例&#xff1a;简单的 JavaWeb 应用&#xff08;Spring Boot Thyme…

Spark任务提交流程

当包含在application master中的spark-driver启动后&#xff0c;会与资源调度平台交互获取其他执行器资源&#xff0c;并通过反向注册通知对应的node节点启动执行容器。此外&#xff0c;还会根据程序的执行规划生成两个非常重要的东西&#xff0c;一个是根据spark任务执行计划生…

【17】Word:林楚楠-供应链❗

目录 题目 NO1.2 NO3 NO4 NO5 NO6 NO7 NO89 题目 NO1.2 另存为&#xff1a;文件→另存为→文档→文件名/考生文件夹F12/FnF12→文件名/考生文件夹 插入→分节符→文本框→输入文件→排版_居中对齐→间距/回车去掉文本框的边框→选中文本框→格式&#xff1a;形状轮廓…

机器学习:监督学习与非监督学习

监督学习是利用带有标签的数据进行训练,模型通过学习输入和输出之间的关系来进行预测。也就是说,数据集中既有输入特征,也有对应的输出标签,模型的目标是找到从输入到输出的映射关系。 而无监督学习则使用没有标签的数据进行训练,模型的任务是发现数据中的内在结构或模式…

递归40题!再见递归

简介&#xff1a;40个问题&#xff0c;有难有易&#xff0c;均使用递归完成&#xff0c;需要C/C的指针、字符串、数组、链表等基础知识作为基础。 1、数字出现的次数 由键盘录入一个正整数&#xff0c;求该整数中每个数字出现的次数。 输入&#xff1a;19931003 输出&#xf…