注册 登录

清河洛

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对象描述的齐普夫分布的随机数


网址导航