• Go语言基础之rand(随机数)包


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

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

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

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

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

    package main
    import (
        "fmt"
        "math/rand"
        "time"
    )
    
    func main() {
        for i := 0; i < 10; i++ {
            r := rand.New(rand.NewSource(time.Now().UnixNano()))
            fmt.Printf("%d ", r.Int31())
        }
    
        fmt.Println("")
        for i := 0; i < 10; i++ {
            fmt.Printf("%d ", rand.Int31())
        }
    }
    
    // 输出
    490307279 1883158150 444844955 1515267566 332588293 405951414 174061166 311302046 1235903925 2086504713 
    1298498081 2019727887 1427131847 939984059 911902081 1474941318 140954425 336122540 208240456 646203300 
    

     

    常用的方法有:(以有种子的为例,无种子的直接通过 rand 报名调用对应的方法)

      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
    func (r *Rand) Int31n(n int32) int32
    func (r *Rand) Int63n(n int64) int64
    

     

    拓展:对于需要随机指定位数的,当位数不够是,可以通过前边补0达到长度一致,如:

    package main
    import (
       "fmt"
       "math/rand"
    )
    func main() {
    
       // 随机产生4位长度伪随机数
       for i := 0; i < 10; i++ {
          fmt.Printf("%.4d ", rand.Int31()%10000)
       }
    }
    // 输出 8081 7887 1847 4059 2081 1318 4425 2540 0456 3300
    

      

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

      该包中常用的是 func Read(b []byte) (n int, err error) 这个方法, 将随机的byte值填充到b 数组中,以供b使用。示例如下

    package main
    import (
    	"crypto/rand"
    	"fmt"
    )
    func main() {
    	b := make([]byte, 20)
    	fmt.Println(b) //
    
    	_, err := rand.Read(b)
    	if err != nil {
    		fmt.Println(err.Error())
    	}
    	fmt.Println(b)
    }
    
    // 输出
    [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
    [148 86 239 131 106 181 189 38 149 255 35 121 215 135 150 158 67 39 167 107]
    

      

    Songzhibin
  • 相关阅读:
    mysql dump 完全备
    CentOS7位安装MySql教程
    mysql 数据备份
    Linux下iostat命令详解
    端口映射
    git+jenkins jar包代码的发布加新建项目
    腾讯面试题
    PHP-----类与对象,成员方法,成员属性,构造方法,析构方法
    PHP-----二维数组和二分查找
    PHP-----数组和常见排序算法
  • 原文地址:https://www.cnblogs.com/binHome/p/11960396.html
Copyright © 2020-2023  润新知