Golang学习日志 ━━ (批量)循环生成随机数出现重复的解决办法

利用纳秒作为种子,每次生成随机数都给一次种子。

import (
	"math/rand"
	"time"
)

const char = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

// 产生32位随机字符串
func rnd() {
	r := rand.New(rand.NewSource(time.Now().UnixNano())) // 产生随机种子
	bytes := []byte(char)
	result := []byte{}
	for i := 0; i < 32; i++ {
		result = append(result, bytes[r.Intn(len(bytes))])
	}
	fmt.Println(string(result))
}

func main() {
	for i := 0; i < 50; i++ {
		rnd()
	}
}

打印结果重复。道理很简单,cpu速度太快了~~~

种子一样,出来随机数就一样。

lP1RbPCV3ZLvXt3gYrMvlspvXzoPDpx8
lP1RbPCV3ZLvXt3gYrMvlspvXzoPDpx8
lP1RbPCV3ZLvXt3gYrMvlspvXzoPDpx8
lP1RbPCV3ZLvXt3gYrMvlspvXzoPDpx8
lP1RbPCV3ZLvXt3gYrMvlspvXzoPDpx8
lP1RbPCV3ZLvXt3gYrMvlspvXzoPDpx8
lP1RbPCV3ZLvXt3gYrMvlspvXzoPDpx8
lP1RbPCV3ZLvXt3gYrMvlspvXzoPDpx8
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN
aiD3eyRoK0O5w1Q8Ve7oL8eYMaeaRipN

那怎么解决呢?在最开始初始化一次种子,后面怎么折腾都不会重复了。

import (
	"math/rand"
	"time"
)

const char = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

// 产生32位随机字符串
func rnd() {
	// 这里不再需要播种
	// r := rand.New(rand.NewSource(time.Now().UnixNano())) // 产生随机种子
	bytes := []byte(char)
	result := []byte{}
	for i := 0; i < 32; i++ {
		result = append(result, bytes[rand.Intn(len(bytes))])
	}
	fmt.Println(string(result))
}

func main() {
	//初始化一次全局种子
	rand.Seed(time.Now().UnixNano())
	
	for i := 0; i < 50; i++ {
		rnd()
	}
}

结果很舒爽,不会再重复。

70ToknlyI1ftW5971HRJT7KJhfVIjVNQ
jcMuyKg1pKs2kKmkobsGKoyz0fziVNSv
EjnUYLe0nIveS0zlF4T8Yes97uRpVbL6
CdvnKc7SRkuKkaCkfxuKfHs4PcVfDA7l
ROi6amFFTPy3DQ3mcCDKjsn3LoCYsKC4
aWNcdykOjzHsllSWrTL6opDEkWoXkLRD
9nGIkhlxnvLOP73jJHLwXyhGKmFDksTL
tFbxUFvs06wp18KxCt7lIh14sUsNjho3
jSnz8XmdLDesYJpn1QqSZI9BhnCW2Qa9
goBzwNLIIbEVPqRORv4i3tobLkKkaMy4
Y0u8WpmkwJvny6dwWIsEIe0I39ORRVjn
fgIptKG3GHvnzBMo4cZHlpe7ypmBsjRG
1i5YwTzppAz8hRwJ7SieMmSjhL4fdWfl
cF7UqQ4Fyyq7T6p4e9y33bhd1NEeWjpR
Ec13eBIkD4IH5m1aN9ykmBYXCZrdpGO5
sKOczsOgLJc9IfkyQDMoMIFABIKPdX1Q
OmhcrQ7LoU0ikxKdVEBqQqGDknp4tzW4
9C2cP52MpQbAsh727b21kb40UryUrPy6
Ev2EsZX2a9g1eyU2ctkAV1CiLZIH3i78
mDXBPTAxx6sANRRbUVOrl2hO7qeE9dhV
pHunirerFPivbEs6IjMGdSjpsMHjK0d0
SjA5NRb6SANN6B6JgUDWYHOZXeLc8t0S
5Am951UYllnOenuudXK4zuvlmm8a62xI
PV5wvP6IC1TSRiQQxUkVtKkotdysI99i
kuDONUnN06YT0VKgynjvpSihyBGbTZYI
rqcMx1MRWT241kJwAJYOBWADWShmTbRr
y8xKvEuVWhHpQ0c1pCEzLiRgMsLp8qp4
KqSgl73dKQfvgjuZOBjL9PjFIYRjfLOX
nmlb3UAPOBcTVOQYejOmHwqPCgZi5yxe
V0iwUp2FXOX5fLkXx9L87Cn44wivwfO9
PO7VuvBivjrbCKHVTU8vo8XhdwNEYUTm
B9L4LWIILKjgRtAtoVYGJdXbix4VEVtR
lsFzCneIMK8hmV3chHlxQSWcqu9L3gAd
gnflXX2Kc78ClK0BFNAmdmMeHbVhzEd2
6eJm4d1bdXQOp1zxU8n7hZ5TrxUKbFEO
evCVdIR3ZByTLGuawcHxxSybrXIzV1cr
pFEZE0pzlKpapcDMXfctaXLl6cjrzkKk
h5N4btnoNJ54EQqzx5r1olwEswjRbbJx
piyrQv0J1nVTabezUr6jNB8wzzMrdHtX
qe8gLqntWjPP7ePqveDPNUc1khRT4Shh
APOAnK8GBW80mAuAzNds7gb2MoK7BdEY
AsGhnyH5oC7cYoyC0RfCGg7dWa55tGgD
lB9T07Td3pTDpelBKf02WdrkdBgoNnaI
QnLYPuDTOfeJtJM12nRSCmQgvtAhJzcL
qxO2m9yjVhSAIsnC0eh3M3scgtX8a7rZ
LiOvWsGyqDs0iA9YKMspdRxXFoY4jTI1
OecDZgo4jyQoZu0mYzSy40YyxGwZvNYs
J4rX3bhKYBjx5Uww44qDB15QxMsLduiA
gBAm2GoYE6aXteGDeaMJ3zC21Hfu4Zy7
exzxLxnwb2obF6WlJyOUdaGJs06VVGy0

实际使用时,如果每个循环中会进行很多操作,那么可能不会重复,但如果你开启了多个线程,仍旧可能重复。

在这里插入图片描述

参考:
golang中的随机数rand
golang rand seed 随机数

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值