生成随机数的正确姿势: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

相关推荐

  • 如何在 Bash 中将字符串计算为数字?

    在 bash 中进行数字运算时,由于 bash 变量本质上是字符串,可能会遇到一些挑战。要将字符串转换为数字并进行计算,您可以使用算术扩展 $(())。以下是如何在 bash 中将字符串转换为数字并进行计算的详细指南: 在 Bash 中,一切都是以字符串的形式存在的,因此直接进行算术运算可能会导致意…

    2026年8月29日
    000
  • 解决三大痛点!三翼鸟建博会升级AI智慧家

    解决三大痛点!三翼鸟建博会升级AI智慧家解决三大痛点!三翼鸟建博会升级AI智慧家解决三大痛点!三翼鸟建博会升级AI智慧家解决三大痛点!三翼鸟建博会升级AI智慧家

    迈入7月,广州进入闷热潮湿的后汛期,走在街头能明显感受到那种令人不适的湿热。尽管如此,并未阻挡来自全国各地客户前往广州的脚步,因为一年一度的建博会正火热进行中。 许多参观者都是抱着“取经”的目的而来。毕竟这里几乎汇聚了中国大家居建装全产业链上的头部品牌。换句话说,想要了解打造理想家居的最前沿方案,来…

    2026年8月29日 用户投稿
    100
  • ubuntu如何卸载apache服务

    卸载删除apache的步骤: 1、删除apache sudo apt-get –purge remove apache-commonsudo apt-get –purge remove apache 2、找到没有删除掉的配置文件,一并删除 sudo find /etc -name “*apach…

    2026年8月29日
    000
  • linux如何启动nginx?

    nginx (engine x) 是一个高性能的http和反向代理web服务器,同时也提供了imap/pop3/smtp服务。nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。 Nginx是一…

    2026年8月29日
    000
  • 本地环境下如何快速搭建 Yii 开发框架?

    在本地环境下快速搭建 yii 开发框架可以通过 composer 安装和配置 yii 基本应用模板来实现。具体步骤包括:1)安装 composer,使用命令 php -r “copy(‘https://getcomposer.org/installer’, &#8…

    2026年8月29日
    100
  • 指纹浏览器手机版本是什么 移动端防关联浏览器特点说明

    答案:指纹浏览器手机版通过模拟不同设备指纹和网络环境,实现移动端多账号独立运行,防止平台关联。它伪装User-Agent、Canvas、WebGL、字体、分辨率等信息,并支持代理IP隔离,确保每个账号呈现为独立访客,适用于运营多社交或电商账号场景。选择时需关注稳定性、指纹真实度、IP集成、多账号管理…

    2026年8月29日
    000
  • 小米16 Pro假想图曝光:背面加入副屏 镜头模组大变

    近日,有科技博主曝光了小米即将推出的旗舰产品——小米16 pro的概念设计图。从流出的图片来看,该机背部的相机模块由以往常见的方形造型变为了矩形结构,并在内部进行了全新布局:左侧设有两枚摄像头(其中一枚为潜望式长焦镜头),其下方新增一枚镜头单元。更为亮眼的是,整个矩形模组中嵌入了一块副屏,其功能设想…

    2026年8月29日
    100
  • 三星Z Fold 7及Z Flip 7今日发布 还有手表、头显等新品

    cnmo获悉,三星galaxy全球新品发布会定于7月9日22:00召开,届时三星z fold 7与z flip 7将同步登场。传闻中的z fold ultra和z flip 7 fe也有可能一同亮相。7月8日,三星官方宣布了手机品牌大使,相关信息显示该代言人很可能是徐明浩。 三星Z Fold 7渲染…

    2026年8月29日
    100
  • Lnmp搭建zabbix运维监控系统

    使用目的? 在公司项目中需要做一个日志监控,最开始选择的是efk,但是efk的资料相对较少并且之前对这几个产品都没接触过,使用起来难度。于是选择了zabbix作为项目的运维监控系统。 zabbix能做什么? zabbix主要是用来网络监控、系统监控、应用监控等场景。zabbix分为server端和a…

    2026年8月29日
    100
  • 免费获取PPT模板 免费在线演示文稿生成平台

    推荐扑奔网、第一PPT、优品PPT、OfficePlus和稻壳儿获取免费高质量模板,比格AIPPT、笔灵PPT、秒出PPT、讯飞智文、轻竹AIPPT支持AI在线生成,适合不同场景下的PPT制作需求。 想找免费的PPT模板和能在线生成演示文稿的平台,其实有不少好用的选择。重点是找那些真正免费、资源靠谱…

    2026年8月28日
    200
  • EVNIA弈威双核电竞显示器24M2N5200X,搭载610Hz超高刷新率

    EVNIA弈威双核电竞显示器24M2N5200X,搭载610Hz超高刷新率EVNIA弈威双核电竞显示器24M2N5200X,搭载610Hz超高刷新率EVNIA弈威双核电竞显示器24M2N5200X,搭载610Hz超高刷新率EVNIA弈威双核电竞显示器24M2N5200X,搭载610Hz超高刷新率

    在fps游戏的紧张对决中,每一次微小的延迟都可能左右战局走向。对于追求极致操作响应的玩家而言,显示器的性能已成为决定竞技水平的关键因素。evnia弈威霹雳x2系列610hz超高刷新率双核电竞显示器24m2n5200x,凭借其顶尖的技术规格与创新设计理念,已然成为fps玩家提升反应速度与操控精度的“实…

    2026年8月28日 用户投稿
    000
  • Android WebView加载支付宝链接失败,如何解决net::ERR_UNKNOWN_URL_SCHEME问题?

    Android WebView加载支付宝链接失败:net::ERR_UNKNOWN_URL_SCHEME问题详解及解决方案 在Android开发中,使用WebView加载包含自定义URL scheme的链接(例如支付宝的alipays://)时,常常遇到net::ERR_UNKNOWN_URL_SC…

    2026年8月28日
    100
  • 入门爬虫,不讲道理,只摆问题

    入门爬虫,不讲道理,只摆问题入门爬虫,不讲道理,只摆问题入门爬虫,不讲道理,只摆问题入门爬虫,不讲道理,只摆问题

    其实我也算是入门爬虫,目前也还有很多东西没有吃透,比如很多人入门选择使用的正则式我就没记清楚,对于很多反扒也并不算特别深入。但这并不影响我学习爬虫的信心和兴趣。。。没办法,必须要学啊。很多数据我不能跪着求别人给,因为别人不会给。。。被逼着学习爬虫,希望我的学习能有好结果吧 import json i…

    2026年8月28日 用户投稿
    000
  • Swoole 协程上下文管理及数据传递的最佳实践

    swoole 协程上下文管理和数据传递的最佳实践包括:1) 使用 swoolecoroutine::getcontext() 和 swoolecoroutine::setcontext() 方法管理上下文;2) 避免频繁读写上下文数据;3) 使用轻量级数据结构存储数据。这些方法有助于在协程间有效传递…

    2026年8月28日
    000
  • win11怎么解决磁盘占用100%的问题_Win11磁盘占用100%的有效解决方案

    首先通过任务管理器定位高磁盘占用进程,结束非关键程序;接着禁用SysMain和Windows Search服务以减少后台读写;暂停Windows Update减轻负载;运行chkdsk检查并修复磁盘错误;最后使用CrystalDiskInfo、TreeSize Free等工具分析硬盘健康与空间占用情…

    2026年8月28日
    000
  • 业绩坠崖,股价狂飙,DeepSeek是用友网络的“华佗”

    互联网江湖风云变幻,用友网络的现状引发诸多关注。雷军曾言“站在风口,猪都能飞”,而如今,在deepseek这股东风的助力下,企业软件服务商们似乎也体验了一把飞翔的快感。然而,用友网络却面临着严峻的挑战。 用友网络与金蝶国际,两岸龙头,近期走势惊人相似:在连续四年下跌后,用友网络年初至今股价上涨55.…

    2026年8月28日
    000
  • Linux安装Redis教程

    为了方便快捷的搭建linux环境,于是有了这几篇文字 CentOS使用yum安装jdkCentOS安装tomcatCentOS安装NginxCentOS安装MySqlCentos安装Redis 1.安装Nginx前的准备请确认gcc g++开发类库是否装好。 yum -y install gcc a…

    2026年8月28日
    000
  • 孙悟空浏览器怎么能弄普通话

    将浏览器语言设为中文并安装普通话语音包,即可实现网页中文显示、普通话朗读与语音输入。 孙悟空浏览器本身并不是一个主流或官方常见的浏览器名称,可能你指的是某款基于 Chromium 内核的第三方浏览器,或者是对“搜狗浏览器”“360浏览器”等名称的误听。但不管具体是哪款浏览器,如果你是想把浏览器中的网…

    2026年8月28日
    000
  • VSCode怎么更改鼠标颜色_VSCode自定义鼠标指针颜色与样式教程

    答案:可通过修改VSCode设置自定义光标颜色、样式、粗细及闪烁方式以提升编码体验。具体包括在settings.json中配置editor.cursorStyle、editor.cursorWidth、editor.cursorBlinking,以及通过workbench.colorCustomiz…

    2026年8月28日
    000
  • 避免 jQuery AJAX POST 请求重复提交的策略与实践

    本文探讨了在使用 jQuery AJAX 进行 POST 请求时,如何有效避免因事件监听器、快速点击或意外行为导致的重复提交问题。我们将介绍一种基于状态标志的解决方案,通过控制请求的执行时机,确保数据提交的准确性和一致性,并提供相应的代码示例和最佳实践建议,以优化用户体验和系统稳定性。 问题描述:A…

    2026年8月28日
    100

发表回复

登录后才能评论
关注微信