golang 生成随机数


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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM