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 mainimport ("crypto/rand""encoding/binary""fmt""time"
)func main() {var n int32binary.Read(rand.Reader, binary.LittleEndian, &n)fmt.Println(n)
}
通用随机数算法
package mainimport ("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 < 0rand.Seed(time.Now().UnixNano())for i := 0; i < size; i++ {if isAll { // random ikindikind = rand.Intn(3)}scope, base := kinds[ikind][0], kinds[ikind][1]rsbytes[i] = uint8(base + rand.Intn(scope))}return string(rsbytes)
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
