生成随机数的正确姿势:Go 语言 rand 包详解

生成随机数的正确姿势:go 语言 rand 包详解

Go 语言的 rand 包提供了生成伪随机数的功能。默认情况下,每次程序运行时生成的随机数序列都是相同的,这是因为 rand 包使用固定的种子值。本文将介绍如何通过设置不同的种子来生成每次运行都不同的随机数,并简单对比 rand 包和 crypto/rand 包的差异与适用场景。

使用 rand 包生成伪随机数

rand 包的核心在于伪随机数的生成。 伪随机数是通过一个确定的算法(通常是线性同余法)生成的,给定相同的初始值(种子),算法产生的序列是完全相同的。 这意味着,如果每次运行程序都使用默认的种子,那么生成的“随机数”序列也会相同。

为了每次运行程序都能得到不同的随机数序列,我们需要为 rand 包设置不同的种子。 一个常用的方法是使用当前时间作为种子。

package mainimport (    "fmt"    "math/rand"    "time")func main() {    // 使用当前时间戳作为随机数种子    rand.Seed(time.Now().UnixNano())    // 生成 0 到 99 之间的随机整数    randomNumber := rand.Intn(100)    fmt.Println("随机数:", randomNumber)}

代码解释:

rand.Seed(time.Now().UnixNano()): 这行代码是关键。time.Now().UnixNano() 获取当前时间的 Unix 纳秒时间戳,它是一个不断变化的值。 将这个值作为 rand.Seed() 的参数,就可以确保每次程序运行时,rand 包使用的种子都是不同的。rand.Intn(100): 这行代码生成一个 0 到 99 (不包括 100) 之间的随机整数。 rand.Intn(n) 函数会返回一个 [0, n) 范围内的伪随机整数。

注意事项:

务必在程序开始时设置随机数种子,通常只需要设置一次。 如果在循环中或者频繁调用随机数生成函数前都设置种子,可能会导致生成的随机数序列关联性过强,影响随机性。rand.Seed() 接受 int64 类型的参数。

rand vs crypto/rand:选择合适的随机数生成器

除了 rand 包,Go 语言还提供了 crypto/rand 包,用于生成更安全的随机数。 那么,应该在什么情况下使用哪个包呢?

rand 包 (math/rand):优点: 速度快,性能高。缺点: 生成的是伪随机数,安全性较低。适用场景: 一般的游戏、模拟、测试等对安全性要求不高的场景。crypto/rand 包:优点: 生成的是真随机数,安全性高。它会利用操作系统提供的随机数生成器,例如 Linux 下的 /dev/urandom。缺点: 速度慢,性能较低。适用场景: 密码学、密钥生成、安全令牌等对安全性要求极高的场景。

以下是一个使用 crypto/rand 包生成随机数的示例:

package mainimport (    "crypto/rand"    "fmt"    "math/big")func main() {    // 生成 0 到 99 之间的随机整数    randomNumber, err := rand.Int(rand.Reader, big.NewInt(100))    if err != nil {        fmt.Println("生成随机数失败:", err)        return    }    fmt.Println("随机数:", randomNumber)}

代码解释:

rand.Int(rand.Reader, big.NewInt(100)): crypto/rand 包的 Int 函数需要两个参数:rand.Reader: 一个全局的 io.Reader 接口,用于从操作系统获取随机数据。big.NewInt(100): 一个 big.Int 类型的整数,表示随机数的上限(不包含)。crypto/rand 包的函数可能会返回错误,需要进行错误处理。

总结:

rand 包和 crypto/rand 包各有优缺点。 在选择随机数生成器时,需要根据实际需求权衡安全性和性能。 如果对安全性要求不高,可以使用 rand 包并设置不同的种子来生成伪随机数。 如果对安全性要求极高,则应使用 crypto/rand 包生成真随机数。 记得根据场景合理选择,才能写出高效且安全的 Go 代码。

以上就是生成随机数的正确姿势:Go 语言 rand 包详解的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1398475.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Go语言随机数生成详解:如何获得每次运行都不同的随机数
上一篇 2025年12月15日 15:27:49
Go语言伪随机数生成详解
下一篇 2025年12月15日 15:28:05

相关推荐

  • win11怎么禁止驱动程序自动更新_Win11阻止特定硬件驱动程序自动安装

    win11怎么禁止驱动程序自动更新_Win11阻止特定硬件驱动程序自动安装win11怎么禁止驱动程序自动更新_Win11阻止特定硬件驱动程序自动安装win11怎么禁止驱动程序自动更新_Win11阻止特定硬件驱动程序自动安装win11怎么禁止驱动程序自动更新_Win11阻止特定硬件驱动程序自动安装

    1、通过设置关闭驱动更新:进入Windows 更新→高级选项→可选更新,将“驱动程序更新”设为手动并保存。2、使用组策略编辑器:在本地组策略中启用“Windows 更新不包括驱动程序”策略。3、修改注册表:将HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurr…

    2026年10月10日 • 用户投稿
    100
  • linux栈是什么

    linux栈是什么linux栈是什么linux栈是什么linux栈是什么

    在linux中,栈是一种串列形式的数据结构;这种数据结构的特点是后入先出,数据只能在串列的一端进行推入和弹出的操作,linux中的栈可以分为进程栈、线程栈、内核栈和中断栈。 本教程操作环境:linux7.3系统、Dell G3电脑。 linux栈是什么 栈 (stack) 是一种串列形式的 数据结构…

    2026年10月10日 • 用户投稿
    000
  • iPhone 17系列还没发布就被唱衰!2025年了竟然还有单摄 Air机型电池太拉胯

    iPhone 17系列还没发布就被唱衰!2025年了竟然还有单摄  Air机型电池太拉胯iPhone 17系列还没发布就被唱衰!2025年了竟然还有单摄  Air机型电池太拉胯iPhone 17系列还没发布就被唱衰!2025年了竟然还有单摄  Air机型电池太拉胯iPhone 17系列还没发布就被唱衰!2025年了竟然还有单摄  Air机型电池太拉胯

    8月29日消息,苹果已确认将于9月10日凌晨1点召开2025年秋季新品发布会,届时iphone 17系列将正式登场。然而,新机尚未亮相,市场评价已出现分歧。 本次最受关注的莫过于全新机型iPhone 17 Air,传闻其厚度仅5.5mm,将成为苹果史上最轻薄的智能手机。但这款主打极致轻薄的新机,却提…

    2026年10月10日 • 用户投稿
    600
  • linux mint是什么

    linux mint是什么linux mint是什么linux mint是什么linux mint是什么

    “linux mint”是一种基于“Ubuntu/Debian”的linux操作系统;该系统由“Linux Mint Team”团队发行,采用了最新的linux内核,支持XWayland,像GNU软件和Gnome桌面,该系统致力于使桌面系统对个人用户每天的工作更易用,更高效。 本教程操作环境:lin…

    2026年10月10日 • 用户投稿
    000
  • 民间故事推文工具_民间故事AI推文工具精选推荐

    民间故事推文工具能显著提升创作效率,它通过提供丰富素材库、AI续写改编、智能文案生成、配图推荐、排版优化及多平台支持等功能,帮助用户快速生成高质量推文;但AI生成内容需人工审核优化,结合选材、改编、文案润色、配图选择与互动设计等技巧,并辅以对民间故事的深入理解、写作技能提升和持续练习,才能真正创作出…

    2026年10月10日
    100
  • 即梦ai制作数字人使用教程完整版

    即梦ai制作数字人使用教程完整版即梦ai制作数字人使用教程完整版即梦ai制作数字人使用教程完整版即梦ai制作数字人使用教程完整版

    即梦ai制作数字人需要准备高质量照片、安装软件、稳定网络和创意耐心。1.上传照片并进行初步处理。2.调整面部特征、肤色、发型等细节。3.导出成图片、视频或3d模型,并应用于各种场景。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 即梦AI制…

    2026年10月10日 • 用户投稿
    100
  • nuttx和linux有什么区别

    nuttx和linux有什么区别nuttx和linux有什么区别nuttx和linux有什么区别nuttx和linux有什么区别

    nuttx和linux的区别:1、nuttx是一个实时嵌入式操作系统,在微控制器环境中使用,而linux是一种免费使用和自由传播的类UNIX操作系统;2、Nuttx根文件系统是一个伪文件系统,真正的文件系统可以挂载在伪文件系统中,而linux根文件系统是一个真正的文件系统,伪文件系统挂载在真正的根文…

    2026年10月10日 • 用户投稿
    100
  • Linux系列之查找命令

    Linux系列之查找命令Linux系列之查找命令Linux系列之查找命令Linux系列之查找命令

    前言 作为前端开发者,我们有时也会需要与Linux系统打交道,因此掌握一些常用的Linux命令和概念是非常重要的。在接下来的几篇文章中,我们将一起探讨Linux的常用知识点。 Linux有四个常用的查找命令:locate、whereis、which 和 find。本文将介绍它们的区别和基本用法。 l…

    2026年10月10日 • 用户投稿
    200
  • win11系统服务哪些可以禁用_win11不必要的系统服务优化指南

    win11系统服务哪些可以禁用_win11不必要的系统服务优化指南win11系统服务哪些可以禁用_win11不必要的系统服务优化指南win11系统服务哪些可以禁用_win11不必要的系统服务优化指南win11系统服务哪些可以禁用_win11不必要的系统服务优化指南

    禁用非必要系统服务可提升Windows 11性能。通过服务管理器、系统配置工具或命令提示符关闭如SysMain、Windows Search、遥测服务等,释放资源,提高响应速度。 如果您发现Windows 11系统运行缓慢或资源占用过高,很可能是由于后台运行了大量非必要的系统服务。这些服务会持续消耗…

    2026年10月10日 • 用户投稿
    100
  • VSCode插件管理:配置同步设置与跨设备备份的策略

    使用VSCode内置Settings Sync功能,通过GitHub账号同步配置、插件等数据,并结合本地备份与版本控制,实现多设备环境统一。 在多设备开发环境中,保持 VSCode 插件和设置的一致性至关重要。手动配置每台设备效率低且容易遗漏,合理的插件管理与配置同步策略能大幅提升开发体验。VSCo…

    2026年10月10日
    100
  • composer如何更新composer自身_Composer更新自身方法

    composer如何更新composer自身_Composer更新自身方法composer如何更新composer自身_Composer更新自身方法composer如何更新composer自身_Composer更新自身方法composer如何更新composer自身_Composer更新自身方法

    使用 composer –version 查看当前版本;2. 运行 composer self-update 更新到最新稳定版,加 –preview 参数可更新到开发版,指定版本号可升级至特定版本;3. 权限不足时 Linux/macOS 用户使用 sudo,Windows …

    2026年10月10日 • 用户投稿
    200
  • linux中total是什么

    linux中total是什么linux中total是什么linux中total是什么linux中total是什么

    linux中total指的是列表中所有文件的磁盘空间占用总和,也即资源占用总和,统计单位是kb;total是在使用“ls -l”命令时显示的第一行结果,其中获取目录的大小并非是目录所包含的文件的总大小,而仅仅是目录自身的大小。 本教程操作环境:linux7.3系统、Dell G3电脑。 linux中…

    2026年10月10日 • 用户投稿
    100
  • 8月微信朋友圈十大谣言出炉:雨天用手机打电话会引雷

    8月微信朋友圈十大谣言出炉:雨天用手机打电话会引雷8月微信朋友圈十大谣言出炉:雨天用手机打电话会引雷8月微信朋友圈十大谣言出炉:雨天用手机打电话会引雷8月微信朋友圈十大谣言出炉:雨天用手机打电话会引雷

    8月29日,微信安全中心发布了8月份朋友圈流传的十大谣言,内容涉及“房东税”、医保新政、医疗补助金等社会热点话题。 微信官方提醒用户应保持冷静与理性,不轻信来源不明的信息,及时通过权威渠道核实消息真伪,杜绝传播未经证实的内容,共同营造清朗、安全、可信的网络空间。 1、9月15日起将开征“房东税”? …

    2026年10月10日 • 用户投稿
    200
  • linux的任务调度机制是什么

    linux的任务调度机制是什么linux的任务调度机制是什么linux的任务调度机制是什么linux的任务调度机制是什么

    linux的任务调度机制是指系统在某个事件执行的特定命令或程序;每一个CPU都会有一个队列来存储处于“TASK_RUNNING”状态的任务,任务调度就是从这些队列中取出优先级最高的任务作为下一个放入CPU执行的任务。 本教程操作环境:linux7.3系统、Dell G3电脑。 linux的任务调度机…

    2026年10月10日 • 用户投稿
    100
  • 安卓是linux系统吗

    安卓是linux系统吗安卓是linux系统吗安卓是linux系统吗安卓是linux系统吗

    安卓是基于linux内核的自由及开发源代码的操作系统,但是并不能将安卓直接理解为linux系统;Linux发行版中的软件通常只收录经过开源社区审核过的开源软件,或者经过商业机构审核的闭源软件,而安卓上面的软件基本都是闭源的,而且针对这些软件基本没有审核机制。 本教程操作环境:linux7.3系统、D…

    2026年10月10日 • 用户投稿
    200
  • Java中如何开发AR应用?Sceneform框架

    Java中如何开发AR应用?Sceneform框架Java中如何开发AR应用?Sceneform框架Java中如何开发AR应用?Sceneform框架Java中如何开发AR应用?Sceneform框架

    sceneform已经停止维护,其替代方案包括unity ar foundation、arcore sdk、vuforia engine和realitykit。1. unity ar foundation提供跨平台支持,适合易用性和广泛的生态系统;2. arcore sdk适合需要底层控制的项目;3…

    2026年10月10日 • 用户投稿
    200
  • linux中tmp是什么文件

    linux中tmp是什么文件linux中tmp是什么文件linux中tmp是什么文件linux中tmp是什么文件

    在linux中,tmp是临时文件;tmp是temporary的缩写,tmp目录的作用就是存放临时文件,tmp目录会默认清理指定天数未用的文件,系统重启会清空目录,“/tmp”目录默认清理10天未用的文件,“/var/tmp”目录默认清理30天未用的文件。 本教程操作环境:linux7.3系统、Del…

    2026年10月10日 • 用户投稿
    100
  • OpenAI斥30亿美元收购AI辅助编码工具Windsurf

    OpenAI斥30亿美元收购AI辅助编码工具WindsurfOpenAI斥30亿美元收购AI辅助编码工具WindsurfOpenAI斥30亿美元收购AI辅助编码工具WindsurfOpenAI斥30亿美元收购AI辅助编码工具Windsurf

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 据报道,知情人士透露,OpenAI已同意以约30亿美元的价格收购人工智能辅助编码工具Windsurf(原名Codeium),这是公司历史上规模最大的一次收购。 据了解,交易尚未最终敲定。Open…

    2026年10月10日 • 用户投稿
    100
  • 全球搜索平台Baidu在线 Baidu搜索引擎免费访问地址

    全球搜索平台Baidu在线 Baidu搜索引擎免费访问地址全球搜索平台Baidu在线 Baidu搜索引擎免费访问地址全球搜索平台Baidu在线 Baidu搜索引擎免费访问地址全球搜索平台Baidu在线 Baidu搜索引擎免费访问地址

    全球搜索平台Baidu在线免费访问地址是https://www.baidu.com,该网站提供高效精准的搜索、多样化的信息整合服务及便捷的用户交互功能。 全球搜索平台Baidu在线 Baidu搜索引擎免费访问地址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来全球搜索平台Baidu在线 B…

    2026年10月10日 • 用户投稿
    200
  • 使用Java操作Solr实现全文检索的配置教程

    使用Java操作Solr实现全文检索的配置教程使用Java操作Solr实现全文检索的配置教程使用Java操作Solr实现全文检索的配置教程使用Java操作Solr实现全文检索的配置教程

    要使用java操作solr实现全文检索,首先必须正确配置solr实例并使用solrj客户端库。1. 启动solr并创建核心,用于存储数据;2. 配置schema定义字段及其类型,尤其对中文检索需引入ik analyzer等分词器并定义text_ik字段类型;3. java项目中引入solrj依赖,创…

    2026年10月10日 • 用户投稿
    200

发表回复

登录后才能评论
关注微信