Golang math/rand随机生成实践教程
Go1.20+应使用rand.New(rand.NewSource(seed))创建独立*rand.Rand实例,避免弃用的rand.Seed()和不安全的全局函数;种子需显式设置(如time.Now().UnixNano()或固定值42),并发安全但推荐按需隔离实例以保障可重现性与性能。
Go 1.20+ 应使用 rand.New(rand.NewSource(seed)) 创建独立 *rand.Rand 实例,避免弃用的 rand.Seed() 和不安全的全局函数;种子需显式设置(如 time.Now().UnixNano() 或固定值 42),并发安全但推荐按需隔离实例以保障可重现性与性能。

Go 语言中 math/rand 包提供了生成伪随机数的能力,但要注意:它默认不加密、不安全,适合一般用途(如游戏、模拟、测试),**不适用于密码学场景**。关键点是——必须显式设置种子(rand.Seed()),否则每次运行都产生相同序列;Go 1.20+ 推荐直接使用 rand.New(rand.NewSource()) 方式避免全局状态干扰。
初始化随机数生成器(推荐方式)
Go 1.20 起,rand.Seed() 已被弃用,应使用独立的 *rand.Rand 实例:
- 用当前纳秒时间作为种子:
rand.New(rand.NewSource(time.Now().UnixNano())) - 若需可复现结果(如单元测试),可用固定数字:
rand.New(rand.NewSource(42)) - 避免使用全局
rand.*函数(如rand.Intn()),它们共享同一个全局生成器,多 goroutine 并发调用可能有竞态
生成常见类型的随机数
调用实例方法比全局函数更安全、更可控:
- 随机整数(0 到 n-1):
r.Intn(100)→ 0~99 的 int - 随机整数范围([min, max] 闭区间):
min + r.Intn(max-min+1) - 随机浮点数 [0.0, 1.0):
r.Float64();扩展为 [a, b):a + r.Float64()*(b-a) - 随机布尔值:
r.Intn(2) == 0或封装为r.Int63()%2 == 0
从切片中随机取元素或打乱顺序
利用 rand.Shuffle() 安全高效地洗牌(原地修改):
- 打乱切片:
r.Shuffle(len(slice), func(i, j int) { slice[i], slice[j] = slice[j], slice[i] }) - 随机取一个:
slice[r.Intn(len(slice))] - 随机取多个不重复项:先 Shuffle,再取前 N 个(比多次
Intn+ 去重更高效)
注意并发与可重现性
多个 goroutine 同时用同一个 *rand.Rand 实例是安全的(内部已加锁),但若追求极致性能,可为每个 goroutine 分配独立实例;若需完全可重现(比如压测、回放),务必固定种子且避免依赖系统时间。
基本上就这些。不复杂但容易忽略种子和实例隔离,写对了就能稳定又灵活地用起来。
Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。
Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。
Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。
PixPix 是面向品牌、卖家和内容团队的在线 AI 图片视频创作平台,提供图视频 Agent、无限画布、图片生成、视频生成、自然语言编辑及商品套图、产品精修和带货视频等电商工具。
Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等
Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。













