0

0

Golangmath/rand生成随机数与模拟实践

P粉602998670

P粉602998670

发布时间:2025-09-18 13:36:01

|

532人浏览过

|

来源于php中文网

原创

答案:Go语言中math/rand包用于生成非加密伪随机数,需用时间种子初始化避免重复序列,推荐rand.New配合rand.NewSource设置种子,可生成整数、浮点数和布尔值,适用于模拟、游戏等场景,如掷骰子实验统计频率,注意不在循环重设种子,并发时加锁或隔离实例,测试用固定种子复现,密码学场景应改用crypto/rand。

golangmath/rand生成随机数与模拟实践

在Go语言中,math/rand 包是生成伪随机数的核心工具。虽然它不适用于加密场景,但在模拟、游戏、测试数据生成等场景中非常实用。本文将介绍如何正确使用

math/rand
生成随机数,并通过一个简单的模拟实践加深理解。

初始化随机数生成器

Go的

rand
包默认使用固定的种子(seed),如果不手动设置,每次运行程序都会产生相同的“随机”序列。为了避免这种情况,需要使用
rand.NewSource
配合当前时间作为种子。

示例代码:

package main

import ( "fmt" "math/rand" "time" )

func init() { rand.Seed(time.Now().UnixNano()) }

从Go 1.20开始,

rand.Seed()
已被弃用,推荐直接使用
rand.New
创建基于时间种子的源:

var rng = rand.New(rand.NewSource(time.Now().UnixNano()))

立即学习go语言免费学习笔记(深入)”;

这样可以确保每次运行程序时生成不同的随机数序列。

生成常见类型的随机数

使用自定义的随机生成器实例,可以灵活生成各种类型的随机值。

Wegic
Wegic

AI网页设计和开发工具

下载
  • 随机整数:使用
    Intn(n)
    生成 [0, n) 范围内的整数
  • 随机浮点数:使用
    Float64()
    生成 [0.0, 1.0) 之间的浮点数
  • 随机布尔值:通过比较
    Float64() < 0.5
    实现
代码示例:

// 生成 1 到 100 之间的随机整数
num := rng.Intn(100) + 1

// 生成 0.0 到 5.0 之间的浮点数 floatNum := rng.Float64() * 5.0

// 随机布尔值 coin := rng.Float64() < 0.5

模拟掷骰子实验

我们通过一个掷六面骰子的模拟来实践随机数的使用。目标是模拟投掷1000次,统计每个点数出现的频率。

package main

import ( "fmt" "math/rand" "time" )

func main() { // 初始化随机源 rng := rand.New(rand.NewSource(time.Now().UnixNano()))

// 统计数组,记录1-6点出现次数
counts := make([]int, 7) // 索引0不用

// 模拟1000次掷骰子
for i := 0; i < 1000; i++ {
    dice := rng.Intn(6) + 1 // 1到6
    counts[dice]++
}

// 输出结果
for i := 1; i <= 6; i++ {
    fmt.Printf("点数 %d: 出现 %d 次\n", i, counts[i])
}

}

运行结果会显示各点数的大致均匀分布,符合概率预期。次数越多,分布越接近理论值(约16.7%)。

注意事项与最佳实践

使用

math/rand
时需注意以下几点:

  • 避免在循环内重复调用
    Seed
    ,应在程序启动时设置一次
  • 并发环境下应使用互斥锁保护随机生成器,或为每个goroutine创建独立实例
  • 如需密码学安全的随机数,请使用
    crypto/rand
  • 测试时可使用固定种子,便于复现结果

基本上就这些。掌握

math/rand
的基本用法后,你可以轻松实现抽奖、抽样、游戏逻辑等常见功能。关键是正确初始化种子并合理选择随机范围。

相关专题

更多
Go中Type关键字的用法
Go中Type关键字的用法

Go中Type关键字的用法有定义新的类型别名或者创建新的结构体类型。本专题为大家提供Go相关的文章、下载、课程内容,供大家免费下载体验。

233

2023.09.06

go怎么实现链表
go怎么实现链表

go通过定义一个节点结构体、定义一个链表结构体、定义一些方法来操作链表、实现一个方法来删除链表中的一个节点和实现一个方法来打印链表中的所有节点的方法实现链表。

442

2023.09.25

go语言编程软件有哪些
go语言编程软件有哪些

go语言编程软件有Go编译器、Go开发环境、Go包管理器、Go测试框架、Go文档生成器、Go代码质量工具和Go性能分析工具等。本专题为大家提供go语言相关的文章、下载、课程内容,供大家免费下载体验。

245

2023.10.13

0基础如何学go语言
0基础如何学go语言

0基础学习Go语言需要分阶段进行,从基础知识到实践项目,逐步深入。php中文网给大家带来了go语言相关的教程以及文章,欢迎大家前来学习。

691

2023.10.26

Go语言实现运算符重载有哪些方法
Go语言实现运算符重载有哪些方法

Go语言不支持运算符重载,但可以通过一些方法来模拟运算符重载的效果。使用函数重载来模拟运算符重载,可以为不同的类型定义不同的函数,以实现类似运算符重载的效果,通过函数重载,可以为不同的类型实现不同的操作。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

187

2024.02.23

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

222

2024.02.23

go语言开发工具大全
go语言开发工具大全

本专题整合了go语言开发工具大全,想了解更多相关详细内容,请阅读下面的文章。

277

2025.06.11

go语言引用传递
go语言引用传递

本专题整合了go语言引用传递机制,想了解更多相关内容,请阅读专题下面的文章。

156

2025.06.26

桌面文件位置介绍
桌面文件位置介绍

本专题整合了桌面文件相关教程,阅读专题下面的文章了解更多内容。

0

2025.12.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.1万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号