zoukankan      html  css  js  c++  java
  • Go Rand小结

      对于Random的使用,在业务中使用频率是非常高的,本文就小结下常用的方法:

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

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

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

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

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

    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())
        }
    }

    //
    1278610617 1508223627 2035989429 921556381 1472325922 1058000409 246974909 2131355695 160634752 1895791427
    // 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达到长度一致,如:

    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)
    }
    
    // [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
    // [68 221 145 73 115 224 13 110 218 130 19 139 38 170 145 58 251 188 126 197]
  • 相关阅读:
    mysql 练习题
    mysql 语法
    mysql数据库简单练习(创建表格,增删改查数据)
    dom对象基础
    JS定时器
    JS小测验
    JS事件练习题
    JS事件
    dom对象
    tiles介绍
  • 原文地址:https://www.cnblogs.com/logo-fox/p/7396710.html
Copyright © 2011-2022 走看看