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
浙公网安备 33010602011771号