Go语言基础之rand(随机数)包
在Golang中,有两个包提供了rand,分别为 "math/rand" 和 "crypto/rand", 对应两种应用场景。
"math/rand" 包实现了伪随机数生成器。也就是生成 整形和浮点型。
该包中根据生成伪随机数是是否有种子(可以理解为初始化伪随机数),可以分为两类:
1、有种子。通常以时钟,输入输出等特殊节点作为参数,初始化。该类型生成的随机数相比无种子时重复概率较低。
2、无种子。可以理解为此时种子为1, Seek(1)。 // 如果无种子编译后运行的结果是定值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | package main import ( "fmt" "math/rand" "time" ) func main() { for i := 0; i < 10; i++ { r := rand.New(rand.NewSource(time.Now().UnixNano())) fmt.Printf( "%d " , r.Int31()) } fmt.Println( "" ) for i := 0; i < 10; i++ { fmt.Printf( "%d " , rand.Int31()) } } // 输出 490307279 1883158150 444844955 1515267566 332588293 405951414 174061166 311302046 1235903925 2086504713 1298498081 2019727887 1427131847 939984059 911902081 1474941318 140954425 336122540 208240456 646203300 |
常用的方法有:(以有种子的为例,无种子的直接通过 rand 报名调用对应的方法)
1> 按类型随机类:
1 2 3 4 5 6 | func (r *Rand) Int() int func (r *Rand) Int31() int32 func (r *Rand) Int63() int64 func (r *Rand) Uint32() uint32 func (r *Rand) Float32() float32 // 返回一个取值范围在[0.0, 1.0)的伪随机float32值 func (r *Rand) Float64() float64 // 返回一个取值范围在[0.0, 1.0)的伪随机float64值 |
2>指定随机范围类:
1 2 3 | func (r *Rand) Intn(n int) int func (r *Rand) Int31n(n int32) int32 func (r *Rand) Int63n(n int64) int64 |
拓展:对于需要随机指定位数的,当位数不够是,可以通过前边补0达到长度一致,如:
1 2 3 4 5 6 7 8 9 10 11 12 13 | package main import ( "fmt" "math/rand" ) func main() { // 随机产生4位长度伪随机数 for i := 0; i < 10; i++ { fmt.Printf( "%.4d " , rand.Int31()%10000) } } // 输出 8081 7887 1847 4059 2081 1318 4425 2540 0456 3300 |
”crypto/rand“ 包实现了用于加解密的更安全的随机数生成器。
该包中常用的是 func Read(b []byte) (n int, err error) 这个方法, 将随机的byte值填充到b 数组中,以供b使用。示例如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | package main import ( "crypto/rand" "fmt" ) func main() { b := make([]byte, 20) fmt.Println(b) // _, err := rand.Read(b) if err != nil { fmt.Println(err.Error()) } fmt.Println(b) } // 输出 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [148 86 239 131 106 181 189 38 149 255 35 121 215 135 150 158 67 39 167 107] |
Songzhibin
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)