📌Golang📌应用📌rand随机数.txt
"math/rand/v2"包实现了伪随机数生成器,适用于模拟等任务,但不应用于安全敏感的工作。
"crypto/rand"包实现了一个加密安全的随机数生成器。
========== ========== ========== ========== ==========
type Source interface {
Uint64() uint64
}
Source为伪随机分布的源,取值范围为[0,1 <<64)。
ChaCha8/PCG以及系统运行时的runtimeSource均实现了Source接口。
ChaCha8是一个基于ChaCha8的加密强随机数生成器。
func NewChaCha8(seed [32]byte) *ChaCha8
PCG是一个具有128位内部状态的PCG发生器。
func NewPCG(seed1, seed2 uint64) *PCG
Rand是一个随机数资源。
func New(src Source) *Rand
func NewZipf(r *Rand, s float64, v float64, imax uint64) *Zipf
返回一个齐普夫随机数生成器。k∈[0,imax]使得P(k)与(v+k)**(-s)成正比。s>1,v>=1。
func (z *Zipf) Uint64() uint64
*Rand具有以下方法:
Int、Int32、Int64、Uint32、Uint64、Float32、Float64、
IntN、Int32N、Int64N、UintN、Uint32N、Uint64N、N、
Perm、Shuffle、NormFloat64、ExpFloat64
包级别提供这些方法,使用私有全局变量globalRand调用。
非负伪随机整数:
func Int() int
func Int32() int32
func Int64() int64
func Uint() uint
func Uint32() uint32
func Uint64() uint64
伪随机浮点数[0.0,1.0):
func Float32() float32
func Float64() float64
伪随机整数[0,n),n<=0时panic:
func IntN(n int) int
func Int32N(n int32) int32
func Int64N(n int64) int64
func UintN(n uint) uint
func Uint32N(n uint32) uint32
func Uint64N(n uint64) uint64
func N[Int intType](n Int) Int
func Perm(n int) []int
有n个元素的伪随机排列的切片,[0,n)范围内整数不重复,n<0时panic
func Shuffle(n int, swap func(i, j int))
打乱一个slice,n为元素个数,以i和j作为索引交换元素,n<0时panic
func NormFloat64() float64
服从标准正态分布(标准差=1,期望=0),取值范围[-math.MaxFloat64,+math.MaxFloat64]的伪随机float64值,
如果要生成不同的正态分布值,调用者可用如下代码调整输出: sample = NormFloat64() * 标准差 + 期望
func ExpFloat64() float64
服从标准指数分布(率参数=1,与期望互为倒数),取值范围(0,+math.MaxFloat64]的伪随机float64值,
如要生成不同的指数分布值,调用者可用如下代码调整输出: sample = ExpFloat64() / 率参数
========== ========== ========== ========== ==========
package random
import "math/rand/v2"
const (
upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
lower = "abcdefghijklmnopqrstuvwxyz"
number = "0123456789"
char62 = upper + lower + number
)
func Uppers(n int) string { return gen(upper, n) }
func Lowers(n int) string { return gen(lower, n) }
func Numbers(n int) string { return gen(number, n) }
func Strings(n int) string { return gen(char62, n) }
func gen(chars string, n int) string {
length := len(chars)
buf := make([]byte, n)
for i := range buf {
buf[i] = chars[rand.IntN(length)]
}
return string(buf)
}
// 生成[s,l]的随机数,可包含负数
func RangeNum(s, l int) int {
if s > l {
s, l = l, s
}
n := rand.IntN(l - s + 1)
return n + s
}
// 打乱一个数组
func Shuffle[T any](sli []T) {
rand.Shuffle(len(sli), func(i, j int) {
sli[i], sli[j] = sli[j], sli[i]
})
}
========== ========== ========== ========== ==========
"crypto/rand"包定义的Reader是一个全局、共享的加密安全随机数生成器。
在Unix类型系统中,会从/dev/urandom读取;而Windows中会调用系统的API。
func Int(rand io.Reader, max *big.Int) (n *big.Int, err error)
返回一个在[0, max)区间服从均匀分布的随机值,如果max<=0则会panic。
func Prime(rand io.Reader, bits int) (p *big.Int, err error)
返回一个具有指定字位数的数字,该数字具有很高可能性是质数。如果从rand读取时出错,或者bits<2会返回错误。
func Read(b []byte) (n int, err error)
本函数是一个使用io.ReadFull调用Reader.Read的辅助性函数。当且仅当err==nil时,返回值n=len(b)。
========== ========== ========== ========== ==========
package random
import (
"crypto/rand"
"encoding/hex"
"fmt"
"math/big"
)
// 随机字节数组
func Bytes(n int) []byte {
b := make([]byte, n)
if _, err := rand.Read(b); err != nil {
panic(err)
}
return b
}
// V4版本不带-号的UUID
func UUID() string { return hex.EncodeToString(Bytes(16)) }
// 六位数字码
func NumCode() string {
num, _ := rand.Int(rand.Reader, big.NewInt(1e6))
return fmt.Sprintf("%06d", num.Int64())
}