我注意到在多种语言中,随机数的生成有一个随机数种子的概念,如果使用不当,将可能生成相同的随机数,例如:
使用go生成一个随机字符串:
const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
func randomString(n int) string {
b := make([]byte, n)
// [1]
// rand.Seed(time.Now().Unix()) 打开此处得到正确的随机数
for i := range b {
// [2]
// rand.Seed(time.Now().Unix()) 打开此处每次得到相同的随机数
b[i] = letterBytes[rand.Intn(len(letterBytes))]
}
//打开【2】得到类似 [71 71 71 71 71 71 71 71 71 71]的相同结果
//打开【1】得到类似 [75 111 79 115 101 73 120 66 71 83]的正常结果
fmt.Println(b)
return string(b)
}
func main() {
s := randomString(10)
fmt.Println(s)
}
我知道如何得到正确的随机数,但我并不清楚随机数生成如何基于或者依赖于随机数种子,请问有人能 简单通俗 的说明一下 随机数种子如何工作吗?
原因非常简单,世界上的一切都是有规律的,不存在任何无规律的事情。包括量子力学也是有规律的。
y=func(x)
只要
x
确定,y
就一定确定。所以计算机世界是不存在随机数的。但是可以做到乍一看是随机的,怎么实现呢?就是不停的换
x
,自然y
就变了。那x
可以取什么?当然就是时间了。计算机的时间从哪里来?从晶体振荡器来。