go语言能不能生成随机数?答案是不能。不光是go语言,任何编程语言都没有办法生成真正的随机数,都是伪随机数!
一般来说,go语言可以用func Seed(seed int64)来生成随机数,其中seed是生成随机数的种子,如果seed是一个固定的值,那么每次生成的随机数就是一样的,当然就失去了随机数的性质和价值了。
为了得到一个变化的随机数,我们通常用时间戳来作为随机数种子,比如这样rand.Seed(time.Now().Unix())就可以获得一个变化的随机数了。如果你需要随机数的频率不够高,比如一秒钟获取一次,那么你会感觉你真的获取到了随机数,因为每次获取到的数字都不同。
如果你获取随机数的频率要更高,比如一秒钟要获取100次,那么rand.Seed(time.Now().Unix())就无法满足你的要求了,你会发现很多连续的重复数字。问题也不大,我们可以用rand.Seed(time.Now().UnixNano())。time.Now().UnixNano()表示纳米级时间戳,如果你最快一纳米获取一次随机数,那么这个方法就基本够用了。如果你获取随机数的频率需要更高,需要1纳米获取多次,那么这个方法也不能满足你的需求了。
看来要获取真正的随机数,只能用量子计算机了!