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
}