新闻中心
如何用Golang使用math/rand生成随机数_Golang rand随机数生成实践
Go语言中math/rand包用于生成伪随机数,适用于游戏、模拟等场景;从Go 1.20起rand.Seed()被弃用,推荐使用rand.New(rand.NewSource(time.Now().UnixNano()))创建随机源,或依赖默认自动播种机制。

在Go语言中,math/rand 包提供了生成伪随机数的功能。虽然它不是加密安全的,但在大多数日常开发场景中(如游戏逻辑、模拟、测试数据生成等)非常实用。本文将介绍如何正确使用 math/rand 生成随机数,并避免常见误区。
初始化随机源(Seed)
如果不设置种子,rand.Intn() 等函数每次运行都会产生相同的序列。这是因为默认的全局源是确定性的。
正确的做法是在程序启动时调用 rand.Seed(),通常使用当前时间作为种子:
注意:从 Go 1.20 开始,rand.Seed() 已被弃用,推荐使用 rand.New(rand.NewSource(seed)) 或直接依赖默认的自动 seeding 行为。现代 Go 版本(1.20+)中,global source 会自动 seed,所以可以直接使用 rand.Intn() 而无需手动 Seed。但为了兼容性和清晰性,建议显式创建自己的 Source:
示例代码:
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
// 创建一个基于当前时间的随机源
src := rand.NewSource(time.Now().UnixNano())
r := rand.New(src)
// 生成 0 到 99 之间的随机整数
n := r.Intn(100)
fmt.Println("随机数:", n)
}
生成不同类型的随机数
通过 rand 实例可以生成多种类型的随机值:
- Intn(n):生成 [0, n) 范围内的随机整数
- Float64():生成 [0.0, 1.0) 范围内的浮点数
- Int63n(n):生成更大的整数范围,适合大数需求
常用示例:
// 随机浮点数(0.0 <= f < 1.0) f := r.Float64() // 随机布尔值 b := r.Float64() < 0.5 // 50% 概率 true // 指定范围的整数,比如 [10, 50] num := r.Intn(41) + 10 // 41 = 50-10+1? 不,Intn(41) 是 0~40,加10变成10~50
并发安全与性能考虑
全局的 rand 函数(如 rand.Intn)使用共享的默认源,在高并发场景下可能成为瓶颈或导致竞争。
小云雀
剪映出品的AI视频和图片创作助手
1949
查看详情
解决方案是为每个 goroutine 创建独立的 *rand.Rand 实例,或使用 sync.Pool 缓存实例。
并发安全示例:
var rngPool = sync.Pool{
New: func() interface{} {
return rand.New(rand.NewSource(time.Now().UnixNano()))
},
}
func getRandom() int {
r := rngPool.Get().(*rand.Rand)
n := r.Intn(100)
rngPool.Put(r)
return n
}
生成随机字符串或切片元素
实际开发中常需要随机字符串或从数组中抽取元素。
随机选择切片元素:
items := []string{"apple", "banana", "cherry"}
choice := items[r.Intn(len(items))]
fmt.Println("选中:", choice)
生成随机字符串:
const letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
func randString(n int, r *rand.Rand) string {
b := make([]byte, n)
for i := range b {
b[i] = letters[r.Intn(len(letters))]
}
return string(b)
}
基本上就这些。只要记得初始化随机源、避免并发问题、合理选择范围,就能在项目中高效使用 math/rand。对于加密场景,请改用 crypto/rand。不复杂但容易忽略细节。
以上就是如何用Golang使用math/rand生成随机数_Golang rand随机数生成实践的详细内容,更多请关注其它相关文章!
# 更大
# 外汇什么网站推广最多
# 产品营销推广好物
# 免费的seo网址营销
# 哪些小说做seo
# 武汉网站首页优化
# 土豆网站建设需要多久
# seo进阶运营
# 廊坊网站怎样优化
# 绍兴网站建设用什么软件
# 德阳设计网站建设
# 适用于
# 但在
# go
# 已被
# 浮点数
# 是在
# 自己的
# 推荐使用
# 如何用
# 随机数
# unix
# ai
# go语言
# golang
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
《刺客信条4:黑旗》重制版新细节曝光:无缝加载 地图更细致!
如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】
AO3网页版合集入口 Archive of Our Own同人作品浏览指南
Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南
神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正
Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略
excel怎么制作工资条 excel快速生成工资条的方法
印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】
QQ邮箱登录首页官网地址2026 QQ邮箱官方网页入口
C#如何安全地从用户上传的XML文件中读取数据? 验证与清理策略
处理嵌套交互式控件:前端可访问性指南
J*aScript中高效清空DOM列表元素:解决for循环中断与任务管理问题
Go语言中Map存储的结构体如何调用指针方法:深入解析与实践
不同用户不同价格! 索尼开启账户个性化定价测试
CSS条件样式无法按设备触发怎么排查_media条件语句正确设置解决触发问题
蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台
QQ邮箱网页版入口 QQ邮箱官方邮箱登录通道
C++ typeid如何获取类型信息_C++ RTTI运行时类型识别用法
c++如何使用TBB库进行任务并行_c++ Intel线程构建模块
如何解决电商平台定制报价请求的“黑洞”问题,SprykerQuoteRequest模块助你提升客户体验与销售效率
Eclipse怎么运行工程_Eclipse工程运行配置说明
Shopware订单对象中获取产品自定义字段的正确方法
Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧
PDF文件体积过大处理_PDF压缩技巧详解
必由学登录入口 必由学官方网站在线访问链接
C++如何实现异步操作_C++11使用std::future和std::async进行异步编程
CSS Box Model与弹性按钮:维持布局稳定的动画实践
Golang指针如何与map组合使用_Golang map指针组合实践
海棠电脑版入口_通过电脑访问海棠官网阅读
Win11怎么设置开机NumLock亮 Win11修改注册表InitialKeyboardIndicators值
零跑汽车11月交付量达70327台 实现连续9个月正增长
192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台
谷歌浏览器浏览体验优化_谷歌浏览器新版直连永久可用提示
Safari自带网页翻译功能怎么用 无需插件轻松看懂外文网站【方法】
大象笔记网页版入口 印象笔记网页版登录入口
京东京造J1和网易云音乐氧气真无线有什么不同_国产电商蓝牙耳机音质对比
J*aScript对象创建方式_J*aScript设计模式应用
KFC早餐时段怎么领特惠代码_KFC早餐订餐优惠代码获取与使用说明
网易大神怎么保存别人动态的图片_网易大神动态图片保存方法
Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】
如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置
J*a如何使用AtomicInteger控制计数_J*a无锁计数器性能分析
服务端验证_j*ascript输入检查
Lar*el如何生成PDF或Excel文件_Lar*el文档导出工具与使用教程
在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用
Lar*el Excel导入时生成自定义递增ID的策略与实践
PrimeNG Sidebar背景色自定义指南:CSS覆盖与主题化实践
KFC套餐升级怎么获取优惠代码_KFC套餐升级活动与优惠代码获取方法
J*aScript生成器_j*ascript异步迭代
Win10文件资源管理器“此电脑”分组怎么关 Win10恢复经典视图【技巧】


2025-11-20
浏览次数:次
返回列表
r := rand.New(src)
// 生成 0 到 99 之间的随机整数
n := r.Intn(100)
fmt.Println("随机数:", n)
}