import "math/rand" func luckyCode() int32 { seed := time.Now().UnixNano() // rand内部运算的随机数 code := rand.New(rand.NewSource(seed)).Int31n(int32(rateMax)) // rand计算得到的随机数 return code }
此方法为伪随机,如果随机数种子seed相同,则得到的code也相同。
但将seed声明全局变量,不用每次都重设随机数种子。高并发下可以得到近似真随机数的效果(高并发下重复几万次真随机数也有重复。。。),但耗时比真随机数低很多。如果要得到随机字符串可以用拼接的形式尽量避免重复(比如 时间戳+随机数),时间戳和随机数在不太高的并发下都相同的概率应该极小吧。。。
【推荐用法】
package main import ( "fmt" "log" "math/rand" "net/http" "time" ) func myHandler(w http.ResponseWriter, r *http.Request) { num := rand.Intn(99990000) fmt.Println(num) } func main() { rand.Seed(time.Now().UnixNano()) http.HandleFunc("/", myHandler) log.Fatal(http.ListenAndServe(":8080", nil)) }
========================================================================
真随机数
package main import ( "crypto/rand" "fmt" "math/big" "time" ) func main() { // 真随机 start := time.Now().UnixNano() num, _ := rand.Int(rand.Reader, big.NewInt(100)) a := int(num.Int64())
fmt.Printf("真随机数类型为:%T,值为%v", a, a) fmt.Println(time.Now().UnixNano() - start) }
结果:
真随机数类型为:int,值为4
2991800
获取一个100以内的int型真随机数用了大概3ms,比较慢
package main import ( "crypto/rand" "fmt" "math/big" "strconv" "strings" ) var arr = [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} func main() { str := randomString(10) // 生成随机10位数字字符串 fmt.Println(str) } func randomString(n int) string { var b []string for i := 0; i < n; i++ { num, _ := rand.Int(rand.Reader, big.NewInt(int64(len(arr)))) // 1.将 *big.Int 转化为 int64 // 2.将 int 64 转化为 int // 3.将 int 转化为 string b = append(b, strconv.Itoa(arr[int(num.Int64())])) } str := strings.Join(b, "") return str }
结果:2792200018