zoukankan      html  css  js  c++  java
  • Go随机数

    随机数和伪随机数

    根据密码学原理,要想对一个“随机数”进行随机性检验有以下几个标准:

    • 统计学伪随机性 - 在给定的随机比特流样本中,1 的数量大致等于 0 的数量,也就是说,“10”“01”“00”“11” 四者数量大致相等。说人话就是:“一眼看上去是随机的”。
    • 密码学安全伪随机性 - 就是给定随机样本的一部分和随机算法,不能有效的演算出随机样本的剩余部分。
    • 真随机性 - 其定义为随机样本不可重现。

    根据以上几个标准,其对应的随机数也就分为以下几类:

    • 伪随机数 - 满足第一个条件的随机数。
    • 密码学安全的伪随机数 - 同时满足前两个条件的随机数。可以通过密码学安全伪随机数生成器计算得出。
    • 真随机数 -同时满足三个条件的随机数。
    转自链接:https://juejin.im/post/5ab0c7f06fb9a028d936fe5c
    C语言伪随机代码:
    /* 使用 ANSI C 可移植算法 */
    static unsigned long int next = 1;    // 种子
    
    int rand(void)                        // 生成伪随机数
    {
        next = next * 1103515245 + 12345;
        return (unsigned int) (next / 65536) % 32768;
    }
    
    void srand(unsigned int seed)         // 修改种
    {
        next = seed;
    }

    伪随机数必须要先生成种子,在GoLang 中,我们可以通过 math/rand 包里的方法来生成一个伪随机数:

    package main
    
    import (
      "fmt"
      "math/rand"
      "time"
    )
    
    func main() {
      rand.Seed(int64(time.Now().UnixNano()))
    
      fmt.Println(rand.Int())
    }
    

    使用真随机数的话,那么可以使用 crypto/rand 包中的方法。(待详细了解)

    package main
    
    import (
      "crypto/rand"
      "fmt"
      "math/big"
    )
    
    func main() {
      // 生成 20 个 [0, 100) 范围的真随机数。
      for i := 0; i < 20; i++ {
        result, _ := rand.Int(rand.Reader, big.NewInt(100))
        fmt.Println(result)
      }
    }
    

  • 相关阅读:
    在网页上下载文件
    sql server 分离附加
    在vue中,ref属性与$refs对象的区别
    在ES6中,export default 和 export的区别
    element-ui之Table表格el-table标签
    element-ui之Form表单el-form标签
    使用Mybatis-Generator自动生成Dao,Entity,Mapping
    linux下普通用户与root的切换
    idea插件将下划线转驼峰形式
    利用wsdl2java工具生成webservice的客户端代码
  • 原文地址:https://www.cnblogs.com/zhucq/p/10348944.html
Copyright © 2011-2022 走看看