Go随机数操作
qingheluo2024-08-05清河洛277
在Go中,"math/rand"包实现了伪随机数生成器,在Go的1.22版本,官方库中在保持"math/rand"包更新的基础上新增了"math/rand/v2"包主要变更点在于性能优化(算法重写)、规范和统一、新的随机生成器和实现补充等在"math/rand/v2"包中几乎将所有函数进行了重新命名,并且新增了很多更强的随机算法,以至于该包并不向前兼容本文我们将学习最新的"math/rand/v2"包type Source表示一个生成均匀分布在范围[0, 1<<64)的int64的伪随机资源Source对于并发使用是不安全的
type Source interface {
...
在Go中,"math/rand"包实现了伪随机数生成器,在Go的1.22版本,官方库中在保持"math/rand"包更新的基础上新增了"math/rand/v2"包
主要变更点在于性能优化(算法重写)、规范和统一、新的随机生成器和实现补充等
在"math/rand/v2"包中几乎将所有函数进行了重新命名,并且新增了很多更强的随机算法,以至于该包并不向前兼容
本文我们将学习最新的"math/rand/v2"包
type Source
表示一个生成均匀分布在范围[0, 1<<64)的int64的伪随机资源
Source对于并发使用是不安全的
type Source interface { Uint64() int64 }
包级函数
包级别的函数都使用的默认的伪随机资源
Int() int :非负伪随机int IntN(n int) int :范围在[0,n)的伪随机int,n<=0会panic UintN(n uint) uint Int32() int32 Int32N(n int32) int32 Uint32() uint32 Uint32N(n int32) uint32 Int64() int64 Int64N(n int64) int64 Uint64() uint64 Int64N(n int64) int64 Float32() float32 :范围在[0.0, 1.0)的伪随机float32 Float64() float64 :范围在[0.0, 1.0)的伪随机float64 NormFloat64() float64 :服从标准正态分布(标准差=1,期望=0)、取值范围在[-math.MaxFloat64, +math.MaxFloat64]的float64 如果要生成不同的正态分布值: NormFloat64() * 标准差 + 期望 ExpFloat64() float64 :服从标准指数分布(速率参数=1,是期望的倒数)、取值范围在(0, +math.MaxFloat64]的float64 如要生成不同的指数分布值: ExpFloat64() / 率参数 Perm(n int) []int :有n个元素的,[0,n)范围内int的伪随机排列的切片 Shuffle(n int, swap func(i, j int)) :随机打断元素的顺序 n是元素的数量,n < 0会panic swap交换索引为i和j的元素 func main() { words := strings.Fields("hello word") rand.Shuffle(len(words), func(i, j int) { words[i], words[j] = words[j], words[i] }) fmt.Println(words) } N(n intType) intType :传入任何int类型的数据,返回[0,n)范围内的一个伪随机值 N(int64(100)) // [0,100)的int64 N(100 * time.Millisecond) // [0,100]毫秒的time.Duration // time.Duration也是一种int64值,它的定义type Duration int64
type Rand
表示一个生成其他各种分布的伪随机数生成器
New(src Source) *Rand :使用一个Source创建一个生成其他各种分布的随机数值的*Rand Source可以为ChaCha8或PCG
Rand的方法与上面的包级函数相同,具体参考包级函数,不同的是没有N()函数
type ChaCha8
表示一个基于ChaCha8的强随机数生成器
NewChaCha8(seed [32]byte) *ChaCha8 :创建一个给定随机数种子的ChaCha8
ChaCha8的方法
MarshalBinary() ([]byte, error) :实现encoding.BinaryMarshaler接口 Seed(seed [32]byte) :使用新的随机数种子重置ChaCha8的状态 Uint64() uint64 :返回均匀分布的随机uint64 UnmarshalBinary(data []byte) error :实现encoding.BinaryUnmarshaler接口
type PCG
表示一个具有128位内部状态的PCG生成器
NewPCG(seed1, seed2 uint64) *PCG 创建一个给定随机数种子的PCG 零PCG等于NewPCG(0,0)
PCG的方法
MarshalBinary() ([]byte, error) :实现encoding.BinaryMarshaler接口 Seed(seed1, seed2 uint64) :使用新的随机数种子重置PCG的状态 Uint64() uint64 :返回均匀分布的随机uint64 UnmarshalBinary(data []byte) error :实现encoding.BinaryUnmarshaler接口
type Zipf
表示一个生成生成服从齐普夫分布的伪随机数生成器
齐普夫分布:值k出现的几率p(k)正比于(v+k)**(-s),其中s>1且k>=0且v>=1
NewZipf(r *Rand, s float64, v float64, imax uint64) *Zipf 创建一个[0, imax]范围内的齐普夫随机数生成器 (z *Zipf) Uint64() uint64 :返回一个服从Zipf对象描述的齐普夫分布的随机数