首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2024年5月1日 Go生态洞察:进化Go标准库 - math/rand/v2

2024年5月1日 Go生态洞察:进化Go标准库 - math/rand/v2

作者头像
猫头虎
发布2025-06-01 13:55:10
发布2025-06-01 13:55:10
14000
代码可运行
举报
运行总次数:0
代码可运行

2024年5月1日 Go生态洞察:进化Go标准库 - math/rand/v2’

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁

🦄 博客首页——🐅🐾猫头虎的博客🎐

专栏链接

🔗 精选专栏

领域矩阵

🌐 猫头虎技术领域矩阵: 深入探索各技术领域,发现知识的交汇点。了解更多,请访问:

学会Golang语言,畅玩云原生,走遍大小厂~💐


在这里插入图片描述
在这里插入图片描述

2024年5月1日 Go生态洞察:进化Go标准库 - math/rand/v2

摘要 🌟

作为一个技术自媒体博主,我是猫头虎,今天我们来深入探讨Go 1.22新发布的math/rand/v2包。这篇博客旨在帮助开发者理解为什么和如何对标准库进行重大改进。📚🔍

引言 🚀

自2012年3月Go 1发布以来,Go标准库的变更一直受到Go兼容性承诺的约束。虽然这种兼容性为Go用户提供了一个稳定的基础,但我们逐渐意识到,原始API中的一些错误无法兼容地修复,另外一些情况是最佳实践和惯例已经发生了变化。本文将详细讨论math/rand/v2的具体改进,并反思其他包的新版本应遵循的原则。

正文 🌐

伪随机数生成器简介 🧩

在深入了解math/rand包之前,让我们先了解一下伪随机数生成器的概念。伪随机数生成器是一种确定性的程序,它从一个小种子输入生成一长串看似随机的数字。虽然这些数字并不真正随机,但它们足够用于仿真、洗牌等非加密用途。

math/rand的问题 🔍
生成器算法 ⚙️

Go 1的生成器需要替换。虽然Go 1生成器速度尚可(每个数字约1.8ns),但它维护了近5KB的内部状态。相比之下,Melissa O’Neill的PCG生成器在每个数字约2.1ns的速度下生成更好的随机数,且仅需要16字节的内部状态。

代码语言:javascript
代码运行次数:0
运行
复制
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.src.Int63()
    }
    return v % n
}
源接口问题 🔧

rand.Source接口定义了一种生成非负int64值的低级随机数生成器。然而,更现代的生成器生成全宽的uint64值,这种接口更为方便。另外,一些生成器需要更大的种子值,而现有接口无法处理。

代码语言:javascript
代码运行次数:0
运行
复制
type Source interface {
    Int63() int64
    Seed(seed int64)
}

func NewSource(seed int64) Source
种子责任 🎲

大多数用户不直接使用Source和Rand,而是通过math/rand包提供的全局生成器函数进行操作。为了确保输出时间相关性,通常会使用rand.Seed(time.Now().UnixNano())。但谁来调用这个方法成为一个问题,导致了很多库在初始化时自行调用了该方法,导致了种子混乱问题。

可扩展性 🛠️

全局生成器在并行使用时无法很好地扩展,因为顶层函数需要通过锁保护共享生成器状态。在并行使用中,获取和释放这个锁比实际生成随机数更为昂贵。

math/rand/v2的解决方案 🚀
新的生成器类型 🌟

math/rand/v2包中移除了Go 1生成器,取而代之的是PCG和ChaCha8两种新生成器类型。这些新类型命名为PCG和ChaCha8,以便于未来添加新算法时能够顺利融入命名方案。

接口变更 🔄

新的Source接口中,Int63方法被Uint64方法取代,并删除了Seed方法。具体的生成器类型可以自行定义其种子方法,例如PCG.Seed和ChaCha8.Seed。

优化和改进 🚀

在新的API中,我们实现了Daniel Lemire的优化算法,使Intn和相关函数更快。此外,我们还解决了ExpFloat64和NormFloat64中的偏差问题,并确保了新值流的正确性。

代码语言:javascript
代码运行次数:0
运行
复制
type Source interface {
    Uint64() uint64
}

func NewPCG(seed uint64) Source {
    return &pcgSource{state: seed}
}

func NewChaCha8(seed []byte) Source {
    // ChaCha8 implementation here
    return &chacha8Source{state: seed}
}
新标准库进化的原则 📜
使用 that/package/v2 的导入路径 🏷️

新的不兼容版本将使用 that/package/v2 作为导入路径,允许旧版和新版包共存。

尊重现有用户和用法 🙌

所有变更必须基于尊重现有使用和用户的原则,不引入不必要的变化。

确保v1用户不被抛弃 🌍

v2包发布时,v1包应重写为v2的薄封装,确保现有的v1使用继续受益于v2中的错误修复和性能优化。

总结 📚

本文详细探讨了Go 1.22新发布的math/rand/v2包及其改进,并分享了进化标准库的原则。本博客内容被收录于猫头虎的Go生态洞察专栏,详情请点击这里

参考资料 🔗

  • Russ Cox. Evolving the Go Standard Library with math/rand/v2. May 1, 2024.

下一篇预告 📢

下一篇文章将探讨在Go 1.22中如何确保随机数生成器的安全性,敬请期待!


知识点

说明

生成器算法

Go 1生成器与PCG、ChaCha8对比

源接口问题

旧接口与新接口的差异

种子责任

谁负责种子初始化

可扩展性

全局生成器的扩展问题

math/rand/v2

新包的主要改进点

QA 环节 🙋

Q1: 为什么需要替换生成器算法?

A1: Go 1生成器速度虽然尚可,但内部状态大且生成的随机数质量较差。新的PCG和ChaCha8生成器不仅速度更快,且内部状态更小,生成的随机数质量更高。

Q2: 新的Source接口有什么不同?

A2: 新接口将Int63方法替换为Uint64方法,并删除了Seed方法,使其更灵活和现代化。

Q3: math/rand/v2包的主要改进点有哪些?

A3: 新包中移除了旧生成器,引入了新的生成器类型,优化了算法,解决了接口问题,并确保了更好的扩展性和安全性。

通过这篇博客,希望大家能够更好地理解和应用math/rand/v2包。感谢阅读!👋

🐅🐾猫头虎建议Go程序员必备技术栈一览表📖: ☁️🐳 Go语言开发者必备技术栈☸️: 🐹 GoLang | 🌿 Git | 🐳 Docker | ☸️ Kubernetes | 🔧 CI/CD | ✅ Testing | 💾 SQL/NoSQL | 📡 gRPC | ☁️ Cloud | 📊 Prometheus | 📚 ELK Stack


🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🐅🐾🍁🐥

原创声明


  • 原创作者: 猫头虎
  • 作者wx: Libin9iOak
  • 作者公众号: 猫头虎技术团队

学习

复习

Go生态


本文为原创文章,版权归作者所有。未经许可,禁止转载、复制或引用。

作者保证信息真实可靠,但不对准确性和完整性承担责任

未经许可,禁止商业用途。

感谢您的支持与尊重。

点击下方名片,加入猫头虎领域矩阵。一起探索科技的未来,洞察Go生态,共同成长。

🔗 猫头虎社群 | 🔗 Go语言VIP专栏| 🔗 GitHub 代码仓库 | 🔗 Go生态洞察专栏

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2024年5月1日 Go生态洞察:进化Go标准库 - math/rand/v2’
  • 2024年5月1日 Go生态洞察:进化Go标准库 - math/rand/v2
    • 摘要 🌟
    • 引言 🚀
    • 正文 🌐
      • 伪随机数生成器简介 🧩
      • math/rand的问题 🔍
      • math/rand/v2的解决方案 🚀
      • 新标准库进化的原则 📜
    • 总结 📚
    • 参考资料 🔗
    • 下一篇预告 📢
    • QA 环节 🙋
  • 原创声明
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档