• Go语言 整数或小数真随机数向量的生成


    随机整数数组

      math/rand的随机数可以说是一次性的,无论for循环执行几次,无论编译执行几次,结果都一模一样,除非重复写多次代码行,可以说实用性很差。

      而crypto/rand的随机数,掌握用法之后,就能得到“真正的随机数”。

      如果在迭代算法中需要用到(粒子群,模拟退火,遗传,梯度下降等等)随机数,千万要用crypto,不能用math.rand,否则仅仅是初始化群体,就全部是一模一样的个体,每次迭代也是一样的随机数,那完全不会有一丁点效果。

    import (

      "crypto/rand"
      "fmt"
      "math/big"

    )
    //// 虚假的随机数
    //func randInt(dim, n int) []int {
    //    var vector []int
    //    rand.Seed(time.Now().UnixNano())
    //    for i := 0; i < dim; i++ {
    //        vector = append(vector, rand.Intn(n))
    //    }
    //    return vector
    //}
    
    // 真正的随机数
    func randInt(dim, n int) []int {
        var vector []int
        for i := 0; i < dim; i++ {
            res, err := rand.Int(rand.Reader, big.NewInt(5))
            if err != nil {
                fmt.Println(err)
            }
            vector = append(vector, int(res.Int64()))
        }
        return vector
    }

    实例:

    func main() {
        for i := 0; i < 4; i++ {
            fmt.Println(randInt(10, 5))
    //        fmt.Println(uniform(10))
        }
    
    }

    编译执行第一次:

    [1 4 3 1 1 3 2 1 0 4]

    [4 0 0 2 0 2 0 0 0 1]

    [0 3 4 2 0 0 1 0 1 2]

    [4 0 1 4 1 4 2 2 4 4]

    编译执行第二次:

    [3 1 3 1 3 0 2 4 2 1]

    [4 0 3 2 1 1 0 1 1 4]

    [4 0 3 2 2 1 2 1 0 2]

    [2 3 4 2 1 0 1 3 1 0]

    ---end---

      事实上掌握了随机整数数组,实现一个0-1随即小数数组并不难,举例如下,精度为0.01的

    // 生成0-1之间随机数的向量
    //虚假的随机数
    func uniforms(dim int) []float64 {
        var vector []float64
        rand.Seed(time.Now().UnixNano())
        for i := 0; i < dim; i++ {
            vector = append(vector, rand.Float64())
        }
        return vector
    }
    
    // 真正的随机数
    func uniform(dim int) []float64 {
        var vector []float64
        for i := 0; i < dim; i++ {
            res, err := rand.Int(rand.Reader, big.NewInt(100))
            if err != nil {
                fmt.Println(err)
            }
            vector = append(vector, float64(res.Int64())/100)
        }
        return vector
    }
    func main() {
        for i := 0; i < 4; i++ {
            //        fmt.Println(randInt(10, 5))
            fmt.Println(uniform(10))
        }
    }

    结果:

    [0.33 0.27 0.68 0.97 0.41 0 0.24 0.27 0.45 0.07]
    [0.05 0.96 0.76 0.15 0.93 0.01 0.14 0.67 0.99 0.31]
    [0.9 0.83 0.84 0.4 0.84 0 0.07 0.96 0.07 0.38]
    [0.65 0.6 0.53 0.68 0.2 0.62 0.73 0.13 0.12 0.18]

  • 相关阅读:
    2018 北京区域赛H
    LeetCode 第 207 场周赛
    LeetCode 第 209 场周赛
    LeetCode 第 211 场周赛
    PAT 甲级真题题解(121-155)
    PAT 甲级真题题解(63-120)
    PAT 甲级真题题解(1-62)
    Codeforces 1108E2 Array and Segments (Hard version)(差分+思维)
    Codeforces 1108F MST Unification(最小生成树性质)
    Codeforces 1092C Prefixes and Suffixes(思维)
  • 原文地址:https://www.cnblogs.com/zhaoke271828/p/14504277.html
Copyright © 2020-2023  润新知