• 随机数


    关于随机数,Go语言标准库提供了两个包来实现,分别是math/rand和crypto/rand。

    1. math/rand
    原理:以一个真随机数(随机种子)作为初始条件,使用一定算法不停迭代产生随机数。
    两个程序,如果设置相同的随机种子和相同的随机数范围,那么它们同样的调用次数,得到的随机数是一样的,所以这个包其实是一个伪随机数生成器。

    下面以代码实践来说明:

    package main
    
    import (
    	"fmt"
    	"math/rand"
    )
    
    func main() {
    	rand.Seed(88)
    	for i := 0; i < 10; i++ {
    		n := rand.Intn(100)
    		fmt.Println(n)
    	}
    }
    

    这个程序,无论运行几次,其结果都是一样的:

    也就是说,rand.Seed()函数设置随机种子为88的时候,第一次调用rand.Intn(100)得到的结果一定是97,第二次调用的结果一定是20,以此类推。

    再来看看下面这个程序:

    package main
    
    import (
    	"fmt"
    	"math/rand"
    )
    
    func main() {
    	for i := 0; i < 10; i++ {
    		rand.Seed(88)
    		n := rand.Intn(100)
    		fmt.Println(n)
    	}
    }
    

    这个程序与上一个程序不同的是,在循环内部设置随机种子,也就是说循环中每次调用rand.Intn(100)的时候,都是设置随机种子为88以后的第一次调用,所以结果一定都是97:

    也就是说,当随机种子确定的时候,产生的随机数序列其实确定的,是伪随机的,那么,要想得到完全随机的随机数序列,就要使用完全随机的随机种子,一般使用系统时间作为随机种子。

    程序示例如下:

    package main
    
    import (
    	"fmt"
    	"math/rand"
    	"time"
    )
    
    func main() {
    	rand.Seed(time.Now().UnixNano())
    	for i := 0; i < 10; i++ {
    		n := rand.Intn(100)
    		fmt.Println(n)
    	}
    }
    

    因为每次调用程序,系统时间都不一样,所以产生的随机数列也就不相同了。

    2. crypto/rand
    原理:利用当前系统的一些特征,比如内存的使用量,文件的使用数量,不同类型的进程数量等等来进行计算产生随机数,因此产生重复随机数的概率很低。
    这个包产生的随机数更安全,加解密一般就使用这个包来产生随机数。

    程序示例:

    package main
    
    import (
    	"crypto/rand"
    	"fmt"
    	"math/big"
    	"os"
    )
    
    func main() {
    	b := new(big.Int).SetInt64(int64(100))
    	for i := 0; i < 10; i++ {
    		n, err := rand.Int(rand.Reader, b)
    		if err != nil {
    			fmt.Println(err)
    			os.Exit(1)
    		}
    		fmt.Println(n)
    	}
    }
    

    注:crypto/rand产生随机数的效率比math/rand要慢很多。

  • 相关阅读:
    破解Excel写密码保护方法
    【收藏推荐】JavaScript 秘密花园
    Flask框架第六篇.Flask中的蓝图和特殊装饰器
    Flask框架第四篇.Flask 中的 请求Request和session
    Flask框架第三篇.Flask 中的 Response
    Flask框架第八篇.请求上下文
    Flask框架第一篇.Flask框架基础
    Flask框架第二篇.Flask中的配置
    Flask框架第五篇.Flask 中的路由
    Flask框架第七篇.CBV和Flasksession
  • 原文地址:https://www.cnblogs.com/wujuntian/p/11691117.html
Copyright © 2020-2023  润新知