zoukankan      html  css  js  c++  java
  • golang-random随机数

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

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

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

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

      2、无种子。可以理解为此时种子为1, Seek(1)。

     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())
        }
    
    // 703626706 738454556 1582952585 1585378792 1337824049 728749578 2042459905 780929790 1910510343 178978546 
    
    // 1106410694 1747278511 460128162 817455089 683024728 1006933274 607811211 629431445 1458323237 469339106 

    设定范围:

    // int
    func randInt(min int , max int) int {
        return min + rand.Intn(max-min)
    }
    
    // float
    func randomFloat(min, max int) float64 {
        if max == min {
            return float64(max)
        }
        return decimal(rand.Float64()*(float64(max) - float64(min)) + float64(min))
    }
    
    func decimal(v float64) float64 {
        val, _ := strconv.ParseFloat(fmt.Sprintf("%.3f", v), 64)
        return val
    }

    常用的方法有:(以有种子的为例,无种子的直接通过 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达到长度一致,如:

    import (
        "fmt"
        "math/rand"
        "time"
    )
    
    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使用。示例如下:

    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)
    }
    
    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]
    // [82 253 252 7 33 130 101 79 22 63 95 15 154 98 29 114 149 102 199 77]
  • 相关阅读:
    golang切片使用append追加内容导致切片值异常问题
    golang对通道进行select,case生效异常问题
    golang defer未按预期顺序执行
    GO实现无锁队列
    mysql建表报错:Specified key was too long
    右键快捷键
    算法与数据结构基础<三>----数据结构基础之栈和队列加强之用栈实现队列
    ios从入门到放弃之C基础巩固-----数组、字符串
    获取股票数据【使用JQData查询行情数据、财务指标、估值指标】
    IDEA配置.gitignore不生效的问题
  • 原文地址:https://www.cnblogs.com/zhzhlong/p/10006938.html
Copyright © 2011-2022 走看看