golang 随机数演化

在Go1.22版本中引入了math/rand/v2包,为原math/rand带来了必要提升

随机数特性

假随机

无论是原版本还是v2版本都不存在真正的随机数,其本质依然是根据初始种子生成的数字序列

全局随机数并发安全

对于原math/rand,全局随机数生成器rngSource在每次获取随机数后,会重新设置rng.vec的值,所以会出现并发冲突。因此通过sync.Mutex来进行并发竞争处理

type lockedSource struct {lk sync.Mutexs  *rngSource
}func (r *lockedSource) Int63() (n int64) {r.lk.Lock()n = r.s.Int63()r.lk.Unlock()return
}

对于v2,全局随机数则是通过在绑定的系统线程获取chacha8随机数生成器,这个锁显然粒度更低,仅在系统线程绑定的协程中加锁

// rand returns a random uint64 from the per-m chacha8 state.
// Do not change signature: used via linkname from other packages.
//go:nosplit
//go:linkname rand
func rand() uint64 {// Note: We avoid acquirem here so that in the fast path// there is just a getg, an inlined c.Next, and a return.// The performance difference on a 16-core AMD is// 3.7ns/call this way versus 4.3ns/call with acquirem (+16%).mp := getg().mc := &mp.chacha8for {// Note: c.Next is marked nosplit,// so we don't need to use mp.locks// on the fast path, which is that the// first attempt succeeds.x, ok := c.Next()if ok {return x}mp.locks++ // hold m even though c.Refill may do stack split checksc.Refill()mp.locks--}
}

原math/rand问题

生成器并不是最优的

可重复性要求意味着无法在不破坏兼容性的情况下替换生成器

Source定义为缩短的63位

Source接口定义为缩短的63位,这并不是现代生成器的uint64

全局生成器的初始化种子责任不明

大多数用户直接使用全局生成器,而全局生成器默认Seed(1),这意味着随机数生成的都是一致的

全局生成器不易拓展

全局生成器为了保护共享的生成器状态,分布到各goroutine会造成锁竞争加剧,此外由于用的同一初始种子,破坏了随机数生成器的可重复性

分裂

在原实现中,先求得小于等于1<<63 - 1且模n为0的最大的int64值,这样确保生成的随机数在取模n后能够均匀分布在[0,n)范围内,但也由此带来了性能问题。

Lemire算法可以使得rand.Intn(1000)快20~30%,可是由于破坏了可重复性,所以无法在原实现直接引入

func (r *Rand) Int63n(n int64) int64 {if n <= 0 {panic("invalid argument to Int63n")}max := int64((1<<63 - 1)  - (1<<63)%uint64(n))v := r.src.Int63()for v > max {v = r.Int63()}return v % n
}

误用Read生成密钥

math/rand并不用于也不适合生成加密密钥

math/rand/v2的解决方案

为解决以上问题,在v2中引入了PCG和chacha8两种随机数生成器实现,更改source接口为现代的uint64。

在全局生成器上,保证每次调用都是全新的种子。此外由于默认全局生成器实现就是chacha8,那么即使误用生成密钥,也不会有特别大的问题

Ref

  1. https://go.dev/blog/randv2

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

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

相关文章

如何全面规避医疗数据安全风险?“一中心三大管控域”打开新思路!

作为医院的核心基础设施&#xff0c;数据库已然演变成了一种具有“资产”属性的重要元素。而随着不断变化的医疗业务场景和日趋严格的合规性要求&#xff0c;如何让安全全方位贯穿医疗数据的生命周期&#xff0c;是一项系统性的建设工作&#xff0c;难点诸多。 基于多年的数据…

vue3专栏项目 -- 项目介绍以及准备工作

这是vue3TS的项目&#xff0c;是一个类似知乎的网站&#xff0c;可以展示专栏和文章的详情&#xff0c;可以登录、注册用户&#xff0c;可以创建、删除、修改文章&#xff0c;可以上传图片等等。 这个项目全部采用Composition API 编写&#xff0c;并且使用了TypeScript&#…

视频剪辑神器:批量高效处理,轻松锐化视频让影片焕然一新!

视频已经成为我们记录生活、分享故事、展示才华的重要形式。然而&#xff0c;面对大量的视频文件&#xff0c;如何批量高效剪辑并提升视频质量&#xff0c;成为了许多人的难题。现在&#xff0c;我们为您带来一款视频剪辑神器&#xff0c;让您轻松处理视频&#xff0c;让您的影…

北京大学-知存科技存算一体联合实验室揭牌,开启知存科技产学研融合战略新升级

5月5日&#xff0c;“北京大学-知存科技存算一体技术联合实验室”在北京大学微纳电子大厦正式揭牌&#xff0c;北京大学集成电路学院院长蔡一茂、北京大学集成电路学院副院长鲁文高及学院相关负责人、知存科技创始人兼CEO王绍迪、知存科技首席科学家郭昕婕博士及企业研发相关负…

leetCode81. 搜索旋转排序数组 II

leetCode81. 搜索旋转排序数组 II 题目思路 可以二分后的具体思路见我的上篇博客 搜索旋转排序数组 代码 class Solution { public:bool search(vector<int>& nums, int target) {if(nums.empty()) return false;int R nums.size() - 1;while(R > 0 &&…

c语言数据结构二(双向链表)

前言 双向链表&#xff08;Doubly Linked List&#xff09;是一种链表数据结构&#xff0c;每个节点包含两个指针&#xff0c;一个指向前一个节点&#xff0c;一个指向后一个节点。相比于单链表&#xff0c;双链表可以双向遍历&#xff0c;因此在某些情况下更加灵活和高效。 …

【Three.js基础学习】15.scroll-based-animation

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 课程要点 结合html等场景 做滚动动画 1.遇到的问题&#xff0c; 在向下滚动时&#xff0c;下方会显白&#xff08;部分浏览器&#xff09; 解决&#xff1a;alpha:true …

Finder Windows for Mac:双系统窗口,一键切换!

Finder Windows for Mac是一款专为Mac用户设计的实用工具&#xff0c;它模拟了Windows系统的窗口管理功能&#xff0c;让Mac用户也能享受到类似Windows的窗口操作体验。这款软件的主要功能是提供一个浮动面板&#xff0c;帮助用户随时即时访问打开的Finder窗口列表&#xff0c;…

某东抢购某台脚本——高版本

某东抢购某台脚本——高调 小白操作-学习参考 说明 这个脚本用于自动化京东的秒杀过程&#xff0c;特别是对于高需求商品如茅台。它展示了通过自动化工具模拟用户行为的能力&#xff0c;但同时也涉及到了使用自动化脚本可能违反网站使用条款的问题。使用此类脚本前应确保合…

在Linux中,标准I/O和文件I/O有什么区别

在Linux操作系统中&#xff0c;标准I/O&#xff08;标准输入输出&#xff09;和文件I/O&#xff08;文件输入输出&#xff09;是两种常见的数据读写方式&#xff0c;它们在使用目的和实现方式上有所区别&#xff1a; 标准I/O&#xff1a; 定义&#xff1a;标准I/O是一种使用标准…

魔方阵(C语言)

一、魔方阵规律&#xff1b; 8 1 6 3 5 7 4 9 2 魔方阵中各数的排列规律如下&#xff1a; (1)将1放在第1行中间一列。 (2)从2开始直到nn止&#xff0c;各数依次按此规则存放&#xff1a;每一个数存放的行比前一个数的行数减1&#xff0c;列数加1(例如上…

谷歌推出10门免费AI课程,无需教科书及费用

谷歌面向小白以及开发者分别推出了不同的AI课程~ 包含初级、中级和高级。课程章节大致包括&#xff1a;&#xff08;含教学视频、参考材料、测验&#xff09; 基础入门&#xff1a;45分钟深入了解生成式AI 简单实操&#xff1a;30分钟掌握大语言模型 了解如何释放生成式 AI S…

在K8S中,静态、动态、自主式Pod有何区别

在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;静态Pod、自主式Pod和动态Pod是不同管理方式下的Pod类型&#xff0c;它们的区别主要体现在创建和管理方式上&#xff1a; 静态Pod&#xff1a; 静态Pod是由kubelet直接管理的&#xff0c;其配置文件存储在节点本地而…

网络工程师证书2023年下半年第一批综合知识

网络工程师证书2023年下半年第一批综合知识 在5G技术中大规模MIMO是指在基站端使用数十个甚至数百个天线元素&#xff0c;同事服务于多个用户。大规模输入输出特性可以允许多个设备同时连接到网络并获得告诉数据传输。 网络切片是一种按需组网的方式&#xff0c;可以让运营商…

标准IO函数-将bmp图片修改为德国国旗样式

代码&#xff1a; #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <pthread.h> #include <semaphore.h…

Vue本地存储(cookie、sessionStorage,localStorage)

Vue本地存储&#xff08;cookie、sessionStorage&#xff0c;localStorage&#xff09; 简介 cookie&#xff1a;登录信息存储在cookie中&#xff0c;有过期时间&#xff0c;过期后即失效sessionStorage&#xff1a;存储在浏览器&#xff0c;浏览器关闭后失效localStorage&am…

怎么办理北京工作居住证

怎么办理北京工作居住证 来源 北京市工作居住证 ciicbj 1 外埠人员工作居住证续签 - 北京市政务服务网 banshi.beijing 2 北京工作居住证办理条件材料及流程 bj.bendibao 3 查看更多2 答案 根据搜索结果,办理北京工作居住证的主要流程如下: 申请条件 具有…

小组练习 : 结合本小组项目写下能想到的所有 SWOT

学生信息管理系统&#xff08;SIMS&#xff09;是设计用来管理学生数据的软件应用程序&#xff0c;包括成绩、考勤记录、个人资料等。对于这样一个系统&#xff0c;进行SWOT分析&#xff08;优势Strengths、劣势Weaknesses、机会Opportunities、威胁Threats&#xff09;可以帮助…

展开说说:Android线程池解析

何谓线程池&#xff1f;本人理解是存放和管理线程的一个容器。 线程池存在的意义是什么&#xff1f; 第一&#xff1a;前面博客提到过创建和销毁线程的操作本身是有性能开销的&#xff0c;如果把使用的线程对象存起来下次用的时候直接取出来用就省去了一次创建和销毁的成本&a…

linux高性能服务器-线程池实现

文章目录 定义应用场景任务类型线程数量数据结构设计&#xff1a;任务设计&#xff1a;队列设计&#xff1a;线程池设计 接口设计 定义 线程池属于生产消费模型&#xff0c;管理维持固定数量线程的池式结构&#xff0c;避免线程频繁的创建和销毁 应用场景 当一类任务耗时&am…