golang 随机数的两种方式
作者:@航空母舰
本文主要介绍了golang 随机数的两种方式,一种是伪随机,另一种是真随机,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
golang支持两种随机数生成方式:
- math/rand // 伪随机
- crypto/rand // 真随机
math/rand伪随机生成的数字是确定的,不论在什么机器、什么时间,只要执行的随机代码一样,那么生成的随机数就一样。为了尽量随机性,那么我们可以每次使用不同的seed来启动程序,就可以保证每次启动都产生新的随机数,聪明的你肯定想到了使用时间戳
func main() { fmt.Println(rand.Intn(100)) //设置随机数种子,由于种子数值,每次启动都不一样 //所以每次随机数都是随机的 rand.Seed(time.Now().UnixNano()) //随机生成100以内的正整数 fmt.Println(rand.Intn(100)) }
crypto/rand 就是从这个地方读“真随机”数字返回,但性能比较慢。比上面慢10倍以上
package main import ( "crypto/rand" "encoding/binary" "fmt" "time" ) func main() { var n int32 binary.Read(rand.Reader, binary.LittleEndian, &n) fmt.Println(n) }
通用随机数算法
package main import ( "fmt" "math/rand" "time" ) func main() { fmt.Println(randomString(6, 0)) } /** * size 随机码的位数 * kind 0 // 纯数字 1 // 小写字母 2 // 大写字母 3 // 数字、大小写字母 */ func randomString(size int, kind int) string { ikind, kinds, rsbytes := kind, [][]int{[]int{10, 48}, []int{26, 97}, []int{26, 65}}, make([]byte, size) isAll := kind > 2 || kind < 0 rand.Seed(time.Now().UnixNano()) for i := 0; i < size; i++ { if isAll { // random ikind ikind = rand.Intn(3) } scope, base := kinds[ikind][0], kinds[ikind][1] rsbytes[i] = uint8(base + rand.Intn(scope)) } return string(rsbytes) }
到此这篇关于golang 随机数的两种方式的文章就介绍到这了,更多相关golang 随机数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!