• UtilRand随机数的玩法


    UtilRand随机数的玩法

    前言 对于随机数的生成用到还是相对比较普遍的,随机字符串,指定长度的随机字符串。。。一大堆,下面,我来研究一下玩法

    简单的随机种子

    我们在项目有时候用到等待随机时长,但是就是由于种子的原因,随机时长变成了定长。下面,就是主要的一个简单的种子

    // 获取随机种子
    // 轻度随机,可以重复的随机
    // 生成方式: 根据种子来确定,获取现在的时间,就是1 - 60的种子
    func NewLowRand() *rand.Rand {
    	second := time.Now().Second()
    	source := rand.NewSource(int64(second))
    	r := rand.New(source)
    	return r
    }
    

    这是一些简单的随机场合还可以勉强使用,但是还是不错的。毕竟只有60个种子,还是少啊

    简单的随机等待时间

    func TimeRandEasy() {
    	second := time.Now().Second()
    	source := rand.NewSource(int64(second))
    	r := rand.New(source)
    	i := r.Int()
    	time.Sleep(time.Duration(i) * time.Second)
    }
    

    种子随机数重复测试

    场景: 相同的随机种子,在不同时间的数字

    // 测试 相同的随机种子,在不同时间的数字
    func SameSeed() {
    	fmt.Println("相同的数字种子,不同时间测试")
    	source := rand.NewSource(int64(777))
    	r1 := rand.New(source).Int()
    	fmt.Println("r1", r1)
    	time.AfterFunc(2 * time.Second, func() {
    		source2 := rand.NewSource(int64(777))
    		r2 := rand.New(source2).Int()
    		fmt.Println("两秒过后的数字", r2)
    	})
    	time.Sleep(3 * time.Second)
    }
    

    测试输出(为了测试正确性,看两次运行的输出)

    # 1
    相同的数字种子,不同时间测试
    r1 2630686136689446574
    两秒过后的数字 2630686136689446574
    PASS
    ok      go-newbase/goutil       3.349s
    
    # 2
    相同的数字种子,不同时间测试
    r1 2630686136689446574
    两秒过后的数字 2630686136689446574
    PASS
    ok      go-newbase/goutil       3.341s
    

    可以看出只要是种子相同,结果就相同,所以,为了保证随机数不同,就要产生不同的种子

    对于种子生成的切片也一样

    func MustLen(len int) []int {
    	fmt.Println("开始生成")
    	var (
    		resultStr []interface{}
    	)
    	// 下面是测试
    	for i := 2; i < 1123456; i++ {
    		str := ""
    		source := rand.NewSource(int64(i))
    		r := rand.New(source)
    		perm := r.Perm(len)
    		for _, v := range perm {
    			str = str + strconv.Itoa(v)
    		}
    
    		if i % 10000 == 0 {
    			fmt.Println(str)
    		}
    		resultStr = append(resultStr, str)
    	}
    
        // 这里面的函数slice.BoolConversion()是我之前讲的切片是否含有重复元素
    	conversion := slice.BoolConversion(resultStr)
    	fmt.Println(conversion)
    	return nil
    }
    

    对于100万的数据量进行测试输出:

    开始生成
    412530
    014235
    215340
    043125
    354012
    ---------------------此处省略很多结果,这些结果我只是进行抽样(肉眼看,哈哈)--------------
    052413
    512430
    310452
    510324
    true
    

    可以看出,100万的随机数字都是不同的

    生成随机指定长度的字符串

    实现思想:用最大的时间戳对int的最大值进行取余数,生成指定的种子,因为时间不可能重复啊

    实现代码

    func StrFixedLen(len int) string {
    	str := ""
    	maxInt := int64(2147483647)
    	unix := time.Now().Unix()
    	d := unix % maxInt
    	source := rand.NewSource(d)
    	r := rand.New(source)
    	perm := r.Perm(len)
    	for _, v := range perm {
    		str = str + strconv.Itoa(v)
    	}
    	return str
    }
    
  • 相关阅读:
    互联网协议入门详解(转)
    文件流结尾的EOF详解
    数字签名是什么?
    SSL/TLS协议运行机制的概述(转)
    图解SSL/TLS协议(转)
    RSA算法原理(转)
    HTML代码简写法:Emmet和Haml(转)
    HTML Email 编写指南(转)
    PHP CodeBase: 判断用户是否手机访问
    Spring Data JPA之Derived query
  • 原文地址:https://www.cnblogs.com/maomaomaoge/p/14129765.html
Copyright © 2020-2023  润新知