当前位置: 首页 > article >正文

随机数与随机数种子

在计算机科学中,随机数种子(简称种子)是伪随机数生成器(PRNG)的初始值。伪随机数生成器并不是真正意义上的随机数生成器,而是通过一系列确定性的算法来生成一系列看起来是随机的数字。种子值决定了这个序列的起点,也就是说,给定相同的种子值,伪随机数生成器将会生成相同的序列。

种子的作用
  1. 初始化状态

    • 种子用于初始化伪随机数生成器的状态。每次启动伪随机数生成器时,都会根据种子值来设置其初始状态。
  2. 确保可重复性

    • 设置相同的种子值,可以确保每次生成的随机数序列相同。这对于科学研究、算法开发和软件测试等场合尤为重要,因为这样可以确保实验或测试结果的一致性和可重复性。
  3. 调试便利

    • 在调试程序时,如果使用固定的种子值,可以帮助开发者重现特定的问题场景,从而更容易地定位和修复错误。

为什么设置了种子值,数值就不会变?

当设置了种子值之后,伪随机数生成器的内部状态被初始化为一个已知的、固定的状态。从这个状态开始,生成器会按照预定的算法生成随机数序列。由于算法本身是确定性的,只要种子相同,生成的序列也一定相同。

假如算法为y = lnx + 2x;种子值就是给x赋值;所以输出的y值一定是定值。

既然是伪随机,为什么几乎每次结果都看起来是随机的?

seed = None 时,伪随机数生成器(PRNG)通常会使用一个非确定性的来源来初始化其状态。这个非确定性的来源通常是系统的时间戳或其他环境变量,比如进程ID、线程ID或者是硬件提供的随机性。因为这些来源随着时间和其他条件的变化而变化,所以每次运行程序时,PRNG 的初始状态都会不同,进而生成的随机数序列也会不同。

为什么 seed = None 会产生不同的随机数?

  1. 系统时间

    • 如果没有显式地设置种子值,许多伪随机数生成器会使用系统当前的时间作为种子值的一部分。因为系统时间不断变化,所以每次程序运行时使用的种子值也会不同,从而导致生成的随机数序列不同。
  2. 环境变量

    • 除了系统时间之外,有些伪随机数生成器还会利用其他环境变量来初始化其状态。这些环境变量也可能随时间和运行环境的不同而变化,因此导致生成的随机数序列不同。

示例:

import numpy as np

# 不指定随机种子的情况
np.random.seed(None)
print("第一次随机数:", np.random.rand(5))

np.random.seed(None)
print("第二次随机数:", np.random.rand(5))

# 指定随机种子的情况
np.random.seed(42)
print("第一次随机数(种子为42):", np.random.rand(5))

np.random.seed(42)
print("第二次随机数(种子为42):", np.random.rand(5))

np.random.seed(13)
print("第三次随机数(种子为13):", np.random.rand(5))
np.random.seed(13)
print("第三次随机数(种子为13):", np.random.rand(5))

结果:

第一次随机数: [0.86992753 0.67600782 0.06811269 0.22725053 0.16067545]
第二次随机数: [0.30769898 0.90467254 0.44883338 0.070852   0.7840202 ]
第一次随机数(种子为42): [0.37454012 0.95071431 0.73199394 0.59865848 0.15601864]
第二次随机数(种子为42): [0.37454012 0.95071431 0.73199394 0.59865848 0.15601864]
第三次随机数(种子为13): [0.77770241 0.23754122 0.82427853 0.9657492  0.97260111]
第三次随机数(种子为13): [0.77770241 0.23754122 0.82427853 0.9657492  0.97260111]
注:种子为13和种子为42的结果一定是这个。

随机数种子有什么作用? 

随机数种子(Random Seed)在计算机科学中主要用于初始化伪随机数生成器(PRNG)。它的主要作用包括但不限于以下几点:

  1. 初始化状态

    • 随机数种子用于初始化伪随机数生成器的内部状态。每一次调用伪随机数生成器之前,都需要通过种子值来设置其初始状态。这个状态决定了随后生成的随机数序列。
  2. 确保可重复性

    • 设置相同的随机数种子可以确保每次生成的随机数序列相同。这对于科研实验、算法开发、软件测试等场合尤为重要,因为这样可以确保实验或测试结果的一致性和可重复性。
  3. 调试便利

    • 在调试程序时,如果使用固定的种子值,可以帮助开发者重现特定的问题场景,从而更容易地定位和修复错误。
  4. 算法测试

    • 在测试算法时,使用固定的随机数种子可以确保每次测试都是在相同的初始条件下进行,这样可以更公平地比较不同算法的表现。
  5. 仿真与建模

    • 在进行仿真或建模时,使用随机数种子可以确保每次运行仿真或模型时产生的随机事件是相同的,这对于验证模型的行为和结果非常有用。

因此,如果想要复现结果一致,最好设置一个随机数种子。


http://www.kler.cn/a/300255.html

相关文章:

  • 【知识分享】PCIe5.0 TxRx 电气设计参数汇总
  • kafka学习笔记7 性能测试 —— 筑梦之路
  • 多监控m3u8视频流,怎么获取每个监控的封面图(纯前端)
  • C# 以管理员方式启动程序全解析
  • uniapp——App 监听下载文件状态,打开文件(三)
  • 昇腾环境ppstreuct部署问题记录
  • java网络编程TCP通信实战:共享聊天室
  • Reduce:一款开源的短网址平台!!【送源码】
  • WEB渗透权限维持篇-映像劫持
  • Oracle start with connect BY 死循环
  • 凸优化学习(1)——什么是凸优化、凸集、凸函数
  • 2024.9.10 作业
  • 大数据-128 - Flink 并行度设置 细节详解 全局、作业、算子、Slot
  • 利用前缀信息解决子数组问题(上)
  • JavaScript变量
  • jupyter出错ImportError: cannot import name ‘np_utils‘ from ‘keras.utils‘ ,怎么解决?
  • 【网络安全 | 渗透工具-目录FUZZ】ffuf安装使用详细教程
  • 【python】OpenCV—Mask RCNN for Object Detection and Instance Segmentation
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等
  • lancedb基础学习
  • k8s集群部署:建立第一个微服务-注册中心Eureka
  • 生动灵活,MegActor重磅升级!旷视科技发布MegActor-Σ:首个基于DiT的人像动画方法!
  • Android 15 正式发布到 AOSP ,来了解下新特性和适配需求
  • 如何打造一个无法被黑的系统—用经验告诉你
  • vue3.0中的组件通信方式
  • 【PGCCC】Postgres 17 中的 3 大特性