新闻中心
Golang如何使用math/rand生成随机数_Golang math/rand随机数生成实践详解
必须初始化种子以避免重复序列,推荐用时间戳;2. Go 1.20 后 Seed 已废弃,建议创建 rand.Rand 实例;3. 可生成整数、浮点数、布尔值及字符串;4. 高并发下应使用 sync.Pool 避免性能瓶颈;5. 非加密场景使用 math/rand,加密需用 crypto/rand。

在Go语言中,math/rand 包是生成伪随机数的主要工具。虽然它不适用于加密场景,但在大多数日
常应用如游戏、模拟、测试数据生成等场景下非常实用。本文将详细介绍如何正确使用 math/rand 生成随机数,并避免常见误区。
初始化随机数生成器(必须设置种子)
Go的 rand.Intn() 等函数默认使用一个全局的共享随机源,如果不设置种子,每次运行程序都会生成相同的“随机”序列。
为避免这种情况,需要使用 rand.Seed() 初始化随机源。推荐使用当前时间作为种子:
import (
"math/rand"
"time"
)
func init() {
rand.Seed(time.Now().UnixNano())
}
从 Go 1.20 开始,rand.Seed() 已被标记为废弃,因为现代版本的Go在首次调用时会自动使用 runtime 随机性初始化。但如果你希望确保行为可预测或手动控制,仍建议显式设置源。
更现代的做法是创建自己的 rand.Rand 实例:
r := rand.New(rand.NewSource(time.Now().UnixNano())) num := r.Intn(100) // 生成 0-99 的随机整数
生成不同类型的随机数
通过自定义的 *rand.Rand 实例,可以灵活生成各种类型的随机值:
NameGPT
免费的名称生成器,AI驱动在线生成企业名称及Logo
119
查看详情
- 随机整数(指定范围): 使用 Intn(n) 生成 [0, n) 范围内的整数
- 随机浮点数: 使用 Float64() 生成 [0.0, 1.0) 之间的浮点数
- 随机布尔值: 使用 Intn(2) == 1 模拟抛硬币
r := rand.New(rand.NewSource(time.Now().UnixNano())) fmt.Println(r.Intn(10)) // 0~9 fmt.Println(r.Float64()) // 0.0 ~ 1.0 fmt.Println(r.Intn(2) == 1) // true or false
生成随机字符串或字节序列
实际开发中常需生成随机字符串(如验证码、token)。可通过预定义字符集和随机索引实现:
const letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
func randomString(n int) string {
b := make([]byte, n)
for i := range b {
b[i] = letters[rand.Intn(len(letters))]
}
return string(b)
}
若需更高性能或并发安全,可结合 sync.Pool 或使用 crypto/rand(用于安全场景)替代。
并发安全与性能考虑
全局的 rand 函数(如 rand.Intn)是并发安全的,但所有goroutine共享同一个锁,高并发下可能成为瓶颈。
解决方案:每个goroutine使用独立的 *rand.Rand 实例:
var src = rand.NewSource(time.Now().UnixNano())
var localRand = sync.Pool{
New: func() interface{} {
return rand.New(src)
},
}
func getRandomInGoroutine() int {
r := localRand.Get().(*rand.Rand)
n := r.Intn(100)
localRand.Put(r)
return n
}
基本上就这些。只要记住初始化种子、合理选择类型、注意并发场景,math/rand 就能稳定可靠地工作。对于加密用途,请改用 crypto/rand。
以上就是Golang如何使用math/rand生成随机数_Golang math/rand随机数生成实践详解的详细内容,更多请关注其它相关文章!
# 自己的
# 域名网站建设银行
# 网页设计与建设网站
# 咸阳网站优化排名效果
# 和平区seo哪家便宜
# seo助手排名
# 教程网站排名推广SEO
# 壹起航站外网站优化
# 惠州网站建设顾问工资
# 汕头专注企业网站建设
# 朝阳网站建设与维护企业
# 布尔值
# 首次
# 就能
# 如果你
# go
# 浮点数
# 如何使用
# 自定义
# 死锁
# 随机数
# crypto
# 币
# 性能瓶颈
# unix
# 工具
# 字节
# go语言
# golang
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
iwriter统一登录平台 iwrite账号密码登录页面
漫蛙官网正版漫画入口 漫蛙2官方网页登录地址
优化Django表单:提交验证失败后保留用户输入
HTML元素状态管理:根据DIV内容动态启用/禁用按钮
AO3访问入口汇总 AO3网页版同人作品一键直达
Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】
AO3最新镜像入口 Archive of Our Own官方平台访问
微信网页版登录教程_微信网页版登录入口在哪
Selenium Python中处理点击后新窗口加载冻结问题的策略与实践
处理Kafka消费者会话超时:深入理解消息处理语义与幂等性
CSS实现侧边栏导航项全宽圆角悬停背景效果
如何在 Excel Online 和 Google 表格中更改日期格式
php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】
免费抖音短视频入口_抖音网页版短视频免费通道
CSS自定义字体样式被系统字体替换怎么办_font-face方式指定font-display控制渲染策略
J*aScript对象创建方式_J*aScript设计模式应用
PrimeNG Sidebar背景色自定义指南:CSS覆盖与主题化实践
outlook中文官网入口地址 outlook官方中文版直达首页链接
FullCalendar 自定义按钮样式定制指南
高德地图家和公司地址在哪设置 高德地图通勤路线设置方法【超详细】
MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复
MAC怎么在地图App里使用“四处看看”_MAC体验部分城市的3D实景街景
Tabulator表格中精确实现日期时间排序的指南
知音漫客官网漫画下载_知音漫客网页版阅读记录
解决 Express.js 中 PUT 请求密码修改失败的路由配置指南
Mac怎么使用表情符号_Mac Emoji快捷键面板
中兴BladeV30怎样用测距估书架层高_iPhone中兴BladeV30测距估书架层高【家装参考】
LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置
Win11怎么合并任务栏图标 Win11开启任务栏合并减少图标占空间【方法】
Archive of Our Own官网直达 AO3最新可用地址一览
如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略
PHP表单数据传递:如何通过隐藏输入字段获取动态ID
MAC怎么安装Homebrew包管理器_MAC为开发者和高级用户安装命令行工具
圆通快递查询实时追踪 圆通物流包裹状态快速查看
composer 和 npm/yarn 在管理依赖方面有什么核心思想差异?
2025-2030年全球乘用车销量预测:新能源成增长主力
如何高效处理PHP中的Excel数据导入导出?PortPHP/Spreadsheet助你轻松搞定!
使用 Pandas 高效处理 .dat 文件:数据清洗与数值计算实战
PyTorch模型训练准确率不提升:诊断与修复常见指标计算错误
XML中包含HTML标签导致解析错误? 正确嵌入非XML数据的两种方法
J*aScriptWebpack优化_J*aScript构建工具实战
怎么在浏览器上运行HTML文件_浏览器运行HTML文件技巧【技巧】
解决Python logging 中 datefmt 导致时间戳固定不变的问题
excel如何生成目录 excel一键生成工作表目录超链接
qq音乐在线播放入口_qq音乐电脑版登录链接
Golang如何使用new_Go new分配内存机制讲解
Go语言JSON解析深度指南:动态访问与结构体映射实践
处理嵌套交互式控件:前端可访问性指南
Angular中单选按钮的正确使用与常见陷阱解析
Fabric Mod开发:在1.19.3+版本中正确添加自定义物品并管理物品组


2025-11-01
浏览次数:次
返回列表