来源:脑子进煎鱼了
大家好,我是煎鱼。
Go 首个标准库的 v2 版本,来自 math/rand/v2 库。将在 Go1.22 正式发布和对外生产可用。

本次由 Go 核心团队负责人 @Russ Cox 推动和发起。
选择 math/rand 库做第一个 v2 标准库变动的原因如下:
math/rand 的老毛病和待提高的地方太多了。例如:过时的生成器、缓慢的算法(性能),以及与 crypto/rand.Read 的不幸冲突等问题。math/rand 的问题也比较显著和明显。在 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、Int31、Int31n、Int63、Int64n 已分别重命名为 IntN、Int32、Int32N、Int64、Int64N。
新增了函数 Uint32、Uint32N、Uint64、Uint64N、Uint、UintN 来生成随机无符号整数。也作为同名函数添加到结构体 Rand 中。
添加了一个函数 N,用于生成任意整数类型的随机数。该函数是基于泛型实现的,以下整数类型是他的类型参数:
type intType interface {
~int | ~int8 | ~int16 | ~int32 | ~int64 |
~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr
}
今天给大家再次分享和更进一步描述了新的 math/rand/v2 库,本次主要变更点在于性能优化(算法重写)、规范和统一、新的随机生成器和实现补充等。
完整阐述的话内容物是比较多的,本次仅挑了一些我觉得使用端上有必要了解的。如果有想进一步了解的同学可以细看:math/rand/v2[2]。
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
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70024923/viewspace-3003590/ ,如需转载,请注明出处,否则将追究法律责任。