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
}
posted @ 2020-12-13 19:28  maob  阅读(103)  评论(0编辑  收藏  举报