Python随机数种子(random seed)的设置小结

随机数种子是控制伪随机数生成器的初始值,通过设置相同的种子,可以确保随机数序列的一致性,本文主要介绍了Python随机数种子(random seed)的设置,感兴趣的可以了解一下

目录
  • 随机数种子的讲解:原理、应用与实例
  • 一、什么是随机数种子?
    • 为什么伪随机数是确定的?
  • 二、随机数种子的作用
    • 1. 保证结果的可复现性
    • 2. 调试更加方便
    • 3. 控制随机行为
  • 三、如何设置随机数种子?
    • 1. Python random 模块
    • 2. NumPy 的随机模块
    • 3. PyTorch 的随机数种子
  • 四、结合代码的完整示例
    • 五、注意事项
      • 六、总结

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

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

        一、什么是随机数种子?

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

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

        为什么伪随机数是确定的?

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

        二、随机数种子的作用

        1. 保证结果的可复现性

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

        2. 调试更加方便

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

        3. 控制随机行为

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

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

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

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

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

        1. Python random 模块

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

        示例:

        import random
        
        random.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 np
        
        np.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 torch
        
        torch.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))          # 结果仍固定
        

        五、注意事项

        种子值的范围:

        • 种子值通常为非负整数。过大的种子可能超出生成器的计算范围(如 32 位系统限制)。

        影响范围:

        • random.seed() 仅影响 Python 的 random 模块,不会影响 NumPy 或 PyTorch 的随机数。
        • 要同时控制多个模块的随机性,需要分别设置种子。

        GPU 的随机性:

        • 使用 GPU 时,某些操作可能仍有不可控的随机性(如非确定性的 CUDA 算法),需要额外设置 torch.backends.cudnn.deterministic = True

        六、总结

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

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

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

        到此这篇关于Python随机数种子(random seed)的设置小结的文章就介绍到这了,更多相关Python随机数种子内容请搜索骃骐网以前的文章或继续浏览下面的相关文章希望大家以后多多支持骃骐网!

        您可能感兴趣的文章:

        • python中的随机数种子seed()用法说明
        • Python中的np.random.seed()随机数种子问题及解决方法
        • Python随机数种子(random seed)的使用

        相关推荐:

        C#中lock关键字的使用小结

        在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块。这是一种简单的同步机制,用来防止多个线程同时访问共享资源或执行需要独占访问的代码段(临界区),...

        flask库中sessions.py的使用小结

        在Flask中Session是一种用于在不同请求之间存储用户数据的机制,Session默认是基于客户端Cookie的,但数据会经过加密签名,防止篡改,下面就来具体介绍一下如何使用 目录1. Flask Session 的基本使用(1) 启用 Session(2) 存储和读取 Session(3) Session 的持久性(Permanent Session)2. Flask Session 的工作...

        c#抽象类和接口的区别小结

        C#中抽象类和接口都支持多态性,但存在关键区别,实际开发中常组合使用,抽象类提供基础实现,接口确保规范一致性,下面就来介绍一下两者的区别,感兴趣的可以了解一下 目录一、相同点二、不同点三、代码示例1. 抽象类示例2. 接口示例四、使用场景选择总结在 C# 中,抽象类(Abstract Class) 和接口(Interface) 都是实现多态性的重要机制,用于定义规范并约束子类 / 实现类的行为,但...

        Python获取浏览器Cookies的四种方式小结

        在进行Web应用程序测试和开发时,获取浏览器Cookies是一项重要任务,本文我们介绍四种用Python获取浏览器Cookies的方式,具有一定的 参考价值,感兴趣的可以了解一下 目录什么是 Cookie?1.使用Selenium库获取浏览器Cookies2.使用浏览器开发者工具获取浏览器Cookies3.使用浏览器驱动程序获取浏览器Cookies4.使用浏览器开发者工具保存Cookies为HAR...

        c#中生成随机数的五种方法

        本文主要介绍了c#中生成随机数的五种方法,包括Random类(、System.Random.Shared、RandomNumberGenerator、GUID、RNGCryptoServiceProvider,下面就来具体介绍一下每个的适用场景,感兴趣的可以了解一下 目录1. 使用Random类(基础随机数)2. 使用System.Random.Shared(线程安全版本)3. 使用System....

        js中如何生成随机数

        生成0到1之间的浮点数直接使用math.random();2. 生成0到max(不包含)的整数使用math.floor(math.random() max);3. 生成min到max之间包含边界的整数应使用math.floor(math.random() (max - min + 1)) + min,注意+1避免范围缺失;4. 安全敏感场景需用window.crypto.getrandomvalu...

        Mybatis四种分页方式小结

        本文详细介绍MyBatis中四种分页方式:数组分页、SQL分页、RowBounds分页及拦截器分页,具有一定的参考价值,感兴趣的可以了解一下 目录数组分页sql分页拦截器分页RowBounds分页数组分页 查询出全部数据,然后再list中截取需要的部分。 mybatis接口 List queryStudentsByArray(); xml配置文件 select * from student ser...

        Go net/http的简单使用小结

        Go语言提供了一个功能丰富的net/http包,它提供了客户端和服务端的实现,使得我们可以比较轻易的创建http服务,下面就来介绍一下Go net/http使用,感兴趣的可以了解一下 目录创建一个简单的http服务ClientRequest结构Response结构总结Go语言提供了一个功能丰富的net/http包,它提供了客户端和服务端的实现,使得我们可以比较轻易的创建http服务。 创建一个简单...

        js如何实现随机数生成

        javascript中实现随机数生成的核心方法是使用math.random()函数,它返回一个[0, 1)区间内的伪随机浮点数。1. 生成[0, 1)范围内的浮点数:直接调用math.random()即可;2. 生成指定范围内的浮点数:使用公式math.random() (max - min) + min;3. 生成指定范围内的整数:通过math.floor(math.random() (max ...

        js 怎样生成随机数数组

        要生成指定范围和数量的随机整数数组,1. 需使用math.random()生成[0,1)的浮点数;2. 通过math.floor(math.random() * (max - min + 1)) + min公式转换为[min, max]范围内的整数;3. 在循环中重复生成并存入数组;4. 可封装为函数以提高复用性,如createrandomintarray(count, min, max);5. ...