【Python学习笔记】深入剖析随机数种子

article/2025/8/30 4:23:09

深入剖析随机数种子

  • 一、定义
    • 1.1 作用
  • 二、实战
    • 2.1 同样的随机数种子
    • 2.2 不同的随机数种子
    • 2.3 不指定随机数种子
  • 三、随机数列的大小是多少呢?
    • 3.1 设定为百万,没问题
    • 3.2 设定为千万,没问题
    • 3.3 设定为亿,没问题
    • 3.4 设定为十亿,没问题
    • 3.5 设定为百亿,内存不够!!
    • 3.6 设定为一万亿,内存更加不够!!!
    • 3.7 换了内存为64G的工作站,设定为一万亿,内存还是不够!!!![在这里插入图片描述](https://img-blog.csdnimg.cn/20201119215044803.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0h1bnRlcl9NdXJwaHk=,size_1,color_FFFFFF,t_70#pic_center)
  • 四、random模块中的随机数种子
    • 4.1 示例
    • 4.2 random模块与 numpy.random的对比

一、定义

  • 随机数就是就随机数种子中取出的数。种子就是个序号,这个序号交给一个数列管理器,通过这个序号,你从管理器中取出一个数列,这个数列就是你通过那个序号得到的随机数。
  • 但这个随技术并不真正随机,而是“伪”随机数。因为它是通过某个算法的得到。也就是说你给数列管理器同一个序号将得到同样一个“随机”数列,也就是说种子和随机数列是一一对应的。
  • {An}=f(x), x 就是种子,F()是算法,{An}是数列,这个数列看上去是随机的,这是因为An的通项很复杂。
  • 换句话说,只要计算方法一定,随机种子一定,那么产生的随机数就不会变。
  • 我们可以把上述的数列管理器看成是一个随机数生成器,也可以堪称是一个黑盒。一般来说,算法构造出一系列随机数是需要初始值的,而我们说的种子就是这个初始值。
  • 只要用户不设置随机种子,那么在默认情况下随机种子来自系统时钟(即定时/计数器的值)。

1.1 作用

  • 深度学习网络模型中初始的权值参数通常都是初始化成随机数
  • 而使用梯度下降法最终得到的局部最优解对于初始位置点的选择很敏感
  • 为了能够完全复现作者的开源深度学习代码,随机种子的选择能够减少一定程度上算法结果的随机性,也就是更接近于原始作者的结果
  • 即产生随机种子意味着每次运行实验,产生的随机数都是相同的

但是

  • 在大多数情况下,即使设定了随机种子,仍然没有办法完全复现paper中所给出的模型性能,这是因为深度学习代码中除了产生随机数中带有随机性,其训练的过程中使用 mini-batch SGD或者优化算法进行训练时,本身就带有了随机性。
  • 因为每次更新都是从训练数据集中随机采样出batch size个训练样本计算的平均梯度作为当前step对于网络权值的更新值,所以即使提供了原始代码和随机种子,因此想要复现作者paper中的性能也是非常困难的!!

二、实战

  • numpy.random.rand(生成随机数的个数) 生成的随机数是遵循均匀分布的!
  • 更多更具体的类型可以参考 random模块与 numpy.random的区别

2.1 同样的随机数种子

import numpy as np
import randomnp.random.seed(0) # 设定种子为0
print(np.random.rand(1)) # 生成1个随机数
# 输出 [0.5488135]np.random.seed(0) # 设定种子为0
print(np.random.rand(2)) # 生成2个随机数
# 输出 [0.5488135  0.71518937]np.random.seed(0) # 设定种子为0
print(np.random.rand(3)) # 生成3个随机数
# 输出 [0.5488135  0.71518937 0.60276338]np.random.seed(0) # 设定种子为0
print(np.random.rand(4)) # 生成4个随机数
# 输出 [0.5488135  0.71518937 0.60276338 0.54488318]np.random.seed(0) # 设定种子为0
print(np.random.rand(5)) # 生成5个随机数
# 输出 [0.5488135  0.71518937 0.60276338 0.54488318 0.4236548 ]np.random.seed(0) # 设定种子为0
print(np.random.rand(6)) # 生成6个随机数
# 输出 [0.5488135  0.71518937 0.60276338 0.54488318 0.4236548  0.64589411]# 上述运行结果验证了定义里面所说的:只要随机数种子是一样的,那么我们从随机数列中同一个位置里面取到的随机数是一样的!!

2.2 不同的随机数种子

np.random.seed(1) # 设定种子为1
print(np.random.rand(6)) # 生成6个随机数
[4.17022005e-01 7.20324493e-01 1.14374817e-04 3.02332573e-011.46755891e-01 9.23385948e-02]

2.3 不指定随机数种子

  • 系统使用当前的时钟作为随机数种子!
print(np.random.rand(6)) # 生成6个随机数
[0.18626021 0.34556073 0.39676747 0.53881673 0.41919451 0.6852195 ]

三、随机数列的大小是多少呢?

  • 出于好奇,个人想探索一个随机数种子最大能生成几个随机数呢?于是我做了下列实验来探索随机数列的上限。
  • 下面的结果中的省略号是因为随机数过多不便于展示,于是使用了省略号!!
  • 下面句式使用同一个随机数种子生成的,所以生成的随机数列是同一个,这一点从前面几个随机数中可以看出!!!

3.1 设定为百万,没问题

np.random.seed(0) # 设定种子为0
print(np.random.rand(1000000)) # 生成百万个随机数
# 输出为[0.5488135  0.71518937 0.60276338 ... 0.36259133 0.51650652 0.90860588]

3.2 设定为千万,没问题

np.random.seed(0) # 设定种子为0
print(np.random.rand(10000000)) # 生成千万个随机数
# 输出为[0.5488135  0.71518937 0.60276338 ... 0.7016828  0.45616281 0.14553608]

3.3 设定为亿,没问题

np.random.seed(0) # 设定种子为0
print(np.random.rand(100000000)) # 生成一亿个随机数
# 输出为[0.5488135  0.71518937 0.60276338 ... 0.08870192 0.45256207 0.17769845]

3.4 设定为十亿,没问题

np.random.seed(0) # 设定种子为0
print(np.random.rand(1000000000)) # 生成十亿个随机数
# 输出为[0.5488135  0.71518937 0.60276338 ... 0.50437869 0.82084559 0.15720507]

3.5 设定为百亿,内存不够!!

np.random.seed(0) # 设定种子为0
print(np.random.rand(10000000000)) # 生成百亿个随机数# 出错!!!!!
Traceback (most recent call last):File "<input>", line 2, in <module>File "mtrand.pyx", line 1154, in numpy.random.mtrand.RandomState.randFile "mtrand.pyx", line 420, in numpy.random.mtrand.RandomState.random_sampleFile "_common.pyx", line 256, in numpy.random._common.double_fill
MemoryError: Unable to allocate 74.5 GiB for an array with shape (10000000000,) and data type float64

3.6 设定为一万亿,内存更加不够!!!

np.random.seed(0) # 设定种子为0
print(np.random.rand(1000000000000)) # 生成一万亿个随机数# 出错!!!!!
Traceback (most recent call last):File "<input>", line 2, in <module>File "mtrand.pyx", line 1154, in numpy.random.mtrand.RandomState.randFile "mtrand.pyx", line 420, in numpy.random.mtrand.RandomState.random_sampleFile "_common.pyx", line 256, in numpy.random._common.double_fill
MemoryError: Unable to allocate 7.28 TiB for an array with shape (1000000000000,) and data type float64# 结果是内存不够!!

3.7 换了内存为64G的工作站,设定为一万亿,内存还是不够!!!在这里插入图片描述

在这里插入图片描述

  • 降低为百亿还是不行,看来目前是没机会亲自探索出生成的随机数列的大小了!

四、random模块中的随机数种子

  • random是python中用于产生随机数的模块.
  • 随机数生成的原理还是一样的

4.1 示例

import random
random.seed(0)
print(random.random())
# 输出为 0.8444218515250481random.seed(0)
print(random.random())
# 输出为 0.8444218515250481

4.2 random模块与 numpy.random的对比

  • 虽然使用了同样的随机数种子,但是二者生成的随机数是不一样的!!!
  • 因此二者还是有区别的。
  • random模块生成的随机浮点数的长度貌似比numpy.random的更长;
  • Python标准库的random模块处理的对象类型更宽泛一些,并不局限于数(int,float等),还可以是字符串等类型。
  • 而numpy.random则专门用于处理数学数据,所以传入的为array,这与NumPy库本身的初衷也很一致。
random.seed(0)
print(random.random())
# 输出为 0.8444218515250481
import numpy as npnp.random.seed(0)
print(np.random.rand())
# 输出为 0.5488135039273248

http://chatgpt.dhexx.cn/article/8YpgYK9V.shtml

相关文章

pytorch的主要模块

1. torch模块 torch模块包含了一些pytorch的常用激活函数&#xff0c;如Sigmoid&#xff08;torch.sigmoid&#xff09;、ReLu&#xff08;torch.relu&#xff09;和Tanh&#xff08;torch.tanh&#xff09;&#xff1b;同时也包含了pytorch张量的一些计算操作&#xff0c;如矩…

np.random.seed()随机数种子学习笔记

文章目录 np.random.seed()随机数种子为什么使用np.random.seed()什么是np.random.seed() 代码理解np.random.seed()的参数适用情况 np.random.seed()随机数种子 为什么使用np.random.seed() 在机器学习中&#xff0c;有很多的操作和算法带有一定的随机性&#xff0c;所以在复…

种子项目详解

引言 在上一篇文章简单讲解了种子项目搭建&#xff0c;但是项目搭建起来是为了方便我们后续开发的。因此了解整个项目的架构&#xff0c;以及各个Maven模块是如何各司其职、相互依赖&#xff0c;是至关重要的。 这里分成两块介绍 lenosp自带的内容新增扩展的内容 lenosp自带…

【Abp VNext】实战入门(九):DbMigrator 自定义项目所需种子数据

前言&#xff1a; 项目开发过程中难免会涉及到一些业务相关的基础数据&#xff0c;我们称之为种子数据&#xff0c;主要为了方便测试功能或者展示效果&#xff1b; 常规做法是手动到数据库表创建数据&#xff0c;但是随着表结构更改或者数据清空后&#xff0c;又要重新录入基…

区块链模块化的大胆尝试,解读公链Celestia

作为以链游为主的社区&#xff0c;暴躁兔也会时常关注加密行业的其他赛道和方向。对于目前市场而言&#xff0c;公链的机会与红利仍然存在&#xff0c;且相对而言&#xff0c;技术创新较多&#xff0c;同时资本也比较喜欢这样的赛道。今天为大家讲解的是Cosmos生态的项目Celest…

scrapy_redis种子优化

前言&#xff1a; 继《scrapy_redis去重优化&#xff08;已有7亿条数据&#xff09;&#xff0c;附Demo福利》优化完去重之后&#xff0c;Redis的内存消耗降了许多&#xff0c;然而还不满足。这次对scrapy_redis的种子队列作了一些优化&#xff08;严格来说并不能用上“优化”…

总结一下Python的模块加载解析

正式的Python专栏第16篇&#xff0c;同学站住&#xff0c;别错过这个从0开始的文章&#xff01; 学委之前分享了很多代码&#xff0c;也发布了几个库。 新手可以从两篇基础文章入手学习&#xff0c;积累了一些代码&#xff0c;可以考虑做成一个个模块&#xff0c;包装代码有利…

C++ 函数(模块化编程)

目录 函数定义 函数 函数定义的语法形式 函数调用 调用函数需要先声明函数原型 函数调用形式 嵌套调用 例3-1编写一个求x的n次方的函数 例3-2 数制转换 源代码&#xff1a; 例3-3 编写程序求π的值 arctan函数 主程序 例3-4 寻找并输出11~999之间的数M&#xf…

单片机常开常闭检测

单片机检测常开常闭点&#xff08;干接点信号&#xff09;的方法&#xff1a;检测干接点的闭合和断开&#xff0c;从而单片机实施一定的操作&#xff0c;它具有两根线&#xff0c;具体步骤&#xff1a;1、引出单片机一个IO口线&#xff0c;连接干接点一端。2、干接点另一端通过…

干海星怎么吃做法 干海星的功效与作用有哪些

干海星是生活中并不常见的一种海鲜类食材&#xff0c;在很多人眼中干海星都是一种中药材&#xff0c;其实它也可以当做一种菜品来食用&#xff0c;那么干海星应该怎么吃呢&#xff1f;接下来我就把自己总结的干海星吃法大全写出来分享给大家。 干海星怎么吃 干海星的功效与作用…

大前端干货资料

JavaScript 文档&#xff1a;https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference ES6 入门教程&#xff1a;https://es6.ruanyifeng.com/ Vue 官网&#xff1a;https://cn.vuejs.org router 官网&#xff1a;https://router.vuejs.org/zh UI框架 Ele…

干簧管(磁开关)

其实干簧管的工作原理并不复杂 干簧管的特点&#xff1a; 干簧管是干式舌簧管的简称&#xff0c;是一种有触点的无源电子开关元件&#xff0c;具有结构简单&#xff0c;体积小便于控制等优点&#xff0c;其外壳一般是一根密封的玻璃管&#xff0c;管中装有两个铁质的弹性簧片…

苹果手机位置共享后没开启定位服务器,iPhone默认开启但无卵用的设置开着干嘛?难怪手机这么耗电...

原标题&#xff1a;iPhone默认开启但无卵用的设置开着干嘛&#xff1f;难怪手机这么耗电 如果你的苹果手机开启了定位功能&#xff0c;那么在iPhone【设置】-【隐私】-【定位服务】-系统服务】&#xff0c;点击进入后有很多项开关&#xff0c;而很多都是在打开定位服务后默认开…

adams打不开提示msc license_adams安装后打不开

虽然要支持正版……但是 安装后打不开&#xff0c;借鉴了adams2017安装教程后台留言 图片发自简书App 1.首先我这么做是因为其实在安装过程中就有一次没找到路径 。所以该方法仅供参考。 图片发自简书App 此时我直接在“此电脑”内搜索“MSC.Software”了 图片发自简书App 耐心…

使用Arduino开发板连接干簧管(Reed Switch)的方法

topic 1.干簧管&#xff08;Reed Switch&#xff09;干簧管的特点&#xff1a;模块使用说明&#xff1a;干簧管有两种常见的类型&#xff1a;干簧管常见的应用需要的组件代码 1.干簧管&#xff08;Reed Switch&#xff09; 干簧管&#xff0c;又称磁力开关或磁簧开关&#xff0…

查看电脑使用日志------电脑干了些什么,别人是否动了你的电脑

** 现在我们都有了电脑&#xff0c;有时候短暂的离开可能会有人偷偷的查看你的电脑&#xff0c;有意无意的&#xff0c;总是会感觉心里不是很踏实&#xff0c;那么怎么知道自己的电脑有没有被别人偷偷的查看呢&#xff0c;下面我们通过一些列操作查看电脑是否被别人动过&#x…

高版本envi打不开Landsat8 C2L2数据解决教程

引申部分不写&#xff0c;直接开干 首先找到你的Landsat8 C2L2数据 进入后将首行GROUP LANDSAT_METADATA_FILE改为GROUP L1_METADATA_FILE 编辑—查找—GROUP LEVEL1_PROCESSING_RECORD&#xff0c;查找下一处可得该区域总和 将 GROUP LEVEL1_PROCESSING_RECORD 到 END_…

【错误记录】Melodyne 报错 ( 无法打开音频文件 )

文章目录 一、报错信息二、修改音源格式三、继续使用 Melodyne 打开 一、报错信息 打开一个 48000Hz , 立体声音源 , 采样位数 32 位的采样 , 无法打开 , 报下面的错误 ; 这是用 Bandicam 录制的音频 , 感觉有点问题 , 之后使用 Au 录制音频 ; 二、修改音源格式 在 Adobe Audit…

带你了解测开

测开——测试开发工程师 测试开发工程师 (Software Development Engineer in Test,简称SDET&#xff09;是指那些既可以称作是开发人员&#xff0c;同时也负责软件开发阶段和测试周期的测试工作的技术人员。一个专业的SDET更关注软件产品的可测性&#xff0c;稳健性和性能。他…

开干,开源 k8s 负载均衡器大比拼

原文链接&#xff1a;https://ewhisper.cn/posts/29610/ &#x1f9e0; 译者声明&#xff1a; 请注意文章发布时间&#xff0c;时间比较久远&#xff0c;部分观点可能已经过时。原文作者为 PureLB 的利益相关者&#xff0c;所以本文可能不尽客观。 词汇表 英文中文备注LoadBala…