您现在的位置是:亿华云 > 知识
Go1.22 新特性:新的 math/rand/v2 库,更快更标准!
亿华云2025-10-06 05:24:25【知识】1人已围观
简介来源:脑子进煎鱼了大家好,我是煎鱼。Go 首个标准库的 v2 版本,来自 math/rand/v2 库。将在 Go1.22 正式发布和对外生产可用。本次由 Go 核心团队负责人 @Russ Cox 推
来源:脑子进煎鱼了
大家好,新特性新我是库更快更煎鱼。
Go 首个标准库的标准 v2 版本,来自 math/rand/v2 库。新特性新将在 Go1.22 正式发布和对外生产可用。库更快更

本次由 Go 核心团队负责人 @Russ Cox 推动和发起。
变动原因
选择 math/rand 库做第一个 v2 标准库变动的新特性新原因如下:
标准库里的 math/rand 的老毛病和待提高的地方太多了。例如:过时的库更快更生成器、缓慢的标准算法(性能),以及与 crypto/rand.Read 的新特性新不幸冲突等问题。计划推动标准库的库更快更 v2 版本升级。先用 math 试试水,标准积累经验。新特性新例如:解决工具生态的库更快更问题(gopls、goimports 等工具对 v2 包的标准支持)。后续再对风险更高的包(如:sync/v2 或 encoding/json/v2)进行新版本迭代。Go1 要求兼容性保障,没法直接对原库进行变更。math/rand 的问题也比较显著和明显。变动清单
删除 Rand.Read 和顶层的亿华云 Read。移除 Source.Seed、Rand.Seed 和顶层 Seed。(意味着像 Int 这样的顶层函数将总是随机播种)移除 Source64,现在 Source 提供了 Uint64 方法,原有的方法没有必要存在了。在 Float32 和 Float64 中使用更直接的实现。以 Float64 为例,它最初使用 float64(r.Int63()) / (1<<63)。但这有一个问题,就是偶尔会四舍五入到 1.0,而 Float64 一定不会。我们期望改成 float64(r.Int63n(1<<53)) / (1<<53),这就避免了四舍五入的问题。用 Rand.Shuffle 的方式实现 Rand.Perm。Shuffle 的效率更高一些,这样可以确保只有一个实现。将 Int31、Int31n、Int63、Int64n 更名为 Int32、Int32n、Int64、Int64n。这些名字是源码库不必要的迂腐和混乱。添加 Uint32, Uint32n, Uint64, Uint64n, Uint, Uintn,将会是 Rand 上的顶级函数和方法。在 Intn, Uintn, Int32n, Uint32n, Int64n, Uint64n 中使用 Lemire 的算法。性能会有新的突破。添加一个新的 Source 实现,PCG-DXSM。包含:NewPCG 等相关 API 可以调用。删除 Mitchell & Reeds LFSR 生成器和 NewSource。一些案例
Read、Seed 函数已被删除
在 math/rand 中存在 Read 函数,他在 v1 版本已经被弃用。

Seed 函数也是:

以上两个方法在 v2 版本中已被正式剔除。
Read,如有类似使用的诉求,会建议使用 crypto/rand 的 Read 来代替:
import(
"crypto/rand" "fmt")
func main(){
b := make([]byte, 3)
_, err := rand.Read(b)
if err != nil{
panic(err)
}
fmt.Printf("煎鱼: %v\n", b)
}
输出结果:
煎鱼: [49 71 122]
Seed,建议调用 New(NewSource(seed)) 来重新初始化随机数生成器。
变更部分内部算法实现
函数 N、IntN、UintN 使用了新的实现算法,有兴趣的同学可以另外抽时间详细看:《A fast alternative to the modulo reduction[1]》。

新增和改变各 IntN 等函数
以前的站群服务器函数名有混淆且命名不够规范的问题。
函数 Intn、Int31、Int31n、Int63、Int64n 已分别重命名为 IntN、Int32、Int32N、Int64、Int64N。
新增了函数 Uint32、Uint32N、Uint64、Uint64N、Uint、UintN 来生成随机无符号整数。也作为同名函数添加到结构体 Rand 中。
新增 N 函数
添加了一个函数 N,用于生成任意整数类型的随机数。该函数是基于泛型实现的,以下整数类型是他的类型参数:
type intType interface{
~int | ~int8 | ~int16 | ~int32 | ~int64|
~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr}
总结
今天给大家再次分享和更进一步描述了新的 math/rand/v2 库,本次主要变更点在于性能优化(算法重写)、规范和统一、新的随机生成器和实现补充等。
完整阐述的话内容物是比较多的,本次仅挑了一些我觉得使用端上有必要了解的。如果有想进一步了解的同学可以细看:math/rand/v2[2]。
参考资料[1]A fast alternative to the modulo reduction: https://lemire.me/blog/2016/06/27/a-fast-alternative-to-the-modulo-reduction/
[2]math/rand/v2: https://pkg.go.dev/math/rand/v2@master
很赞哦!(28)
相关文章
- 只要我们做的是从目前的市场情况选择域名,从简单易记,从个性特征上,我们就可以找到一个好域名进行注册。域名注册进行域名记录和解析以及绑定网站后,客户可以通过URL登录您的网站。
- 分层架构演化:从单体的插件化演化所引起的思考
- 深入分析EF Core事务提交,分布式事务
- 字节跳动最爱考的前端面试题:计算机网络基础
- 网站页面结构改版,仅是页面样式发生变化,不会对排名、收录有影响;只有涉及到页面URL改变,才会对网站排名、收录有影响。
- 详解 ZooKeeper 数据持久化
- Java 面试虐我千百遍,我带面试如初恋
- Java编程内功-数据结构与算法「队列」
- 评估域名涉及的行业规模与发展状况成正比。
- 未来程序员拿试管“写”代码?
热门文章
站长推荐
当投资者经过第二阶段的认真学习之后又充满了信心,认为自己可以在市场上叱咤风云地大干一场了。但没想到“看花容易绣花难”,由于对理论知识不会灵活运用.从而失去灵活应变的本能,就经常会出现小赢大亏的局面,结果往往仍以失败告终。这使投资者很是困惑和痛苦,不知该如何办,甚至开始怀疑这个市场是不是不适合自己。在这种情况下,有的人选择了放弃,但有的意志坚定者则决定做最后的尝试。
如何优雅地回答面试官关于MySQL索引的拷问
双链表,这回彻底搞dong了
常见的AI编程语言优缺点比较,程序员千万不要入错行!
四、一定要仔细阅读细节
Java编程内功-数据结构与算法「队列」
基于数组或链表实现Map
不了解这12个语法糖,别说你会Java!