码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • go rand 包


    文章目录

    • go rand 包
      • rand 介绍
      • math/rand
        • 基本使用
        • 常用的方法
        • 生成定长的随机数
      • crypto/rand

    go rand 包

    rand 介绍

    在Golang中,有两个包提供了rand,分别为 “math/rand” 和 “crypto/rand”, 对应两种应用场景

    “math/rand” 包实现了伪随机数生成器。也就是生成 整形和浮点型

    “crypto/rand” 包实现了用于加解密的更安全的随机数生成器

    math/rand

    该包中根据生成伪随机数是是否有种子(可以理解为初始化伪随机数),可以分为两类:

    1、有种子。通常以时钟,输入输出等特殊节点作为参数,初始化。该类型生成的随机数相比无种子时重复概率较低。

    2、无种子。可以理解为此时种子为1, Seek(1)。 // 如果无种子编译后运行的结果是定值

    系统每次都会先用Seed函数初始化系统资源,如果用户不提供seed参数,则默认用seed=1来初始化,这就是为什么每次都输出一样的值的原因,而且,Seed方法是并发安全的.
    所谓种子,通俗理解可以理解为一个抽奖的奖池,我们自定义一个奖池,从我们的奖池中进行随机抽奖,种子就是我们奖池中的数据

    基本使用

    func main(){
    
        r := rand.New(rand.NewSource(time.Now().UnixNano()))
        fmt.Println(r.Int31())
        fmt.Println(rand.Int31()) //没有种子, 一旦编译过后(go build),永远不变
        
        //或者如下方式使用种子
        //设置种子方式一
        rand.Seed(time.Now().Unix())  // 时间戳
        fmt.Println(rand.Intn(999))
        //设置种子方式二
        r:=rand.New(rand.NewSource(time.Now().Unix())) // 生成对象时,设置种子
        fmt.Println(r.Intn(999))
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    常用的方法

    1> 按类型随机类:
    func (r *Rand) Int() int
    func (r *Rand) Int31() int32
    func (r *Rand) Int63() int64
    func (r *Rand) Uint32() uint32
    func (r *Rand) Float32() float32  // 返回一个取值范围在[0.0, 1.0)的伪随机float32值
    func (r *Rand) Float64() float64  // 返回一个取值范围在[0.0, 1.0)的伪随机float64值
    
    
    2> 指定随机范围类:
    func (r *Rand) Intn(n int) int  // [0,n)
    func (r *Rand) Int31n(n int32) int32
    func (r *Rand) Int63n(n int64) int64
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    生成定长的随机数

    //生成固定长度4位,当位数不够是,可以通过前边补0达到长度一致
    func main(){
    	for i := 0; i < 10; i++ {
    		res:=rand.Int31()
    		fmt.Print(res,"----")
    		fmt.Printf("%.4d \n", res%10000)  // 对10000取余数,固定4位长度
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    crypto/rand

    该包中常用的是 func Read(b []byte) (n int, err error)这个方法, 将随机的byte值填充到b 数组中,以供b使用,math/rand下也有Read方法,但是其安全性不如 crypto/rand 下的Read方法

    b := make([]byte, 5)
    fmt.Println(b)
    _, err := rand.Read(b)
    if err != nil {
    	fmt.Println(err)
    }
    fmt.Println(b)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    【CVPR 2018】PIXOR: 点云中三维目标的实时检测
    终于过了一把区块链的瘾
    新建Maui工程运行到IiOS物理设备提示 Could not find any available provisioning profiles for iOS 处理办法
    【MineCraft】-- 学习我的世界Mod制作引雷附魔书与事件
    【吞噬星空4】鸽了那么多次,吞噬终于开始预热,火星场景公布
    XP电源维修fleXPower电源X7-2J2J2P-120018系列详解
    《软件方法(下)》第8章2023版连载(05)关于实体类
    基于B/S版java语言+SpringBoot技术开发的云HIS系统源码 HIS系统住院业务模块常见问题及解决方案
    干货!十分钟搞懂消息队列的选型
    Vue基础02、过滤案例、购物车案例
  • 原文地址:https://blog.csdn.net/qq_55752792/article/details/126103814
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号