golang连续生成随机数重复

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang连续生成随机数重复相关的知识,希望对你有一定的参考价值。

看上图!
这是睡眠时间之后:

其实我猜测是循环已经好几遍了,但是电脑的时间还没有变,导致多次循环的种子纳秒数一致,才生成了相同的数。

package main
import (
"fmt"
"math/rand"
"time"
)
func main() 
for i := 0; i < 20; i++ 
r := rand.New(rand.NewSource(time.Now().UnixNano()))
//rand.Seed(time.Now().UnixNano()) //以当前纳秒数作为随机数种子
n := r.Int63()
fmt.Println(n)

查了下这样可以

不知道他内部怎么实现的   unixnano 

追问

你看下我电脑的执行情况:

追答

删掉 exe
重新编译安装呢

追问

不行!

来自:求助得到的回答
参考技术A package mainimport ("fmt""math/rand""time")func main()
r := rand.New(rand.NewSource(time.Now().UnixNano()))
for i := 0; i < 20; i++ //rand.Seed(time.Now().UnixNano()) //以当前纳秒数作为随机数种子n := r.Int63()fmt.Println(n)
//相同的种子 会输出相同的随机值

golang 使用Golang生成随机字符串

package main

import (
	"math/rand"
	"testing"
	"time"
)

// Implementations

func init() {
	rand.Seed(time.Now().UnixNano())
}

var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")

func RandStringRunes(n int) string {
	b := make([]rune, n)
	for i := range b {
		b[i] = letterRunes[rand.Intn(len(letterRunes))]
	}
	return string(b)
}

const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
const (
	letterIdxBits = 6                    // 6 bits to represent a letter index
	letterIdxMask = 1<<letterIdxBits - 1 // All 1-bits, as many as letterIdxBits
	letterIdxMax  = 63 / letterIdxBits   // # of letter indices fitting in 63 bits
)

func RandStringBytes(n int) string {
	b := make([]byte, n)
	for i := range b {
		b[i] = letterBytes[rand.Intn(len(letterBytes))]
	}
	return string(b)
}

func RandStringBytesRmndr(n int) string {
	b := make([]byte, n)
	for i := range b {
		b[i] = letterBytes[rand.Int63()%int64(len(letterBytes))]
	}
	return string(b)
}

func RandStringBytesMask(n int) string {
	b := make([]byte, n)
	for i := 0; i < n; {
		if idx := int(rand.Int63() & letterIdxMask); idx < len(letterBytes) {
			b[i] = letterBytes[idx]
			i++
		}
	}
	return string(b)
}

func RandStringBytesMaskImpr(n int) string {
	b := make([]byte, n)
	// A rand.Int63() generates 63 random bits, enough for letterIdxMax letters!
	for i, cache, remain := n-1, rand.Int63(), letterIdxMax; i >= 0; {
		if remain == 0 {
			cache, remain = rand.Int63(), letterIdxMax
		}
		if idx := int(cache & letterIdxMask); idx < len(letterBytes) {
			b[i] = letterBytes[idx]
			i--
		}
		cache >>= letterIdxBits
		remain--
	}

	return string(b)
}

var src = rand.NewSource(time.Now().UnixNano())

func RandStringBytesMaskImprSrc(n int) string {
	b := make([]byte, n)
	// A src.Int63() generates 63 random bits, enough for letterIdxMax characters!
	for i, cache, remain := n-1, src.Int63(), letterIdxMax; i >= 0; {
		if remain == 0 {
			cache, remain = src.Int63(), letterIdxMax
		}
		if idx := int(cache & letterIdxMask); idx < len(letterBytes) {
			b[i] = letterBytes[idx]
			i--
		}
		cache >>= letterIdxBits
		remain--
	}

	return string(b)
}

// Benchmark functions

const n = 16

func BenchmarkRunes(b *testing.B) {
	for i := 0; i < b.N; i++ {
		RandStringRunes(n)
	}
}

func BenchmarkBytes(b *testing.B) {
	for i := 0; i < b.N; i++ {
		RandStringBytes(n)
	}
}

func BenchmarkBytesRmndr(b *testing.B) {
	for i := 0; i < b.N; i++ {
		RandStringBytesRmndr(n)
	}
}

func BenchmarkBytesMask(b *testing.B) {
	for i := 0; i < b.N; i++ {
		RandStringBytesMask(n)
	}
}

func BenchmarkBytesMaskImpr(b *testing.B) {
	for i := 0; i < b.N; i++ {
		RandStringBytesMaskImpr(n)
	}
}

func BenchmarkBytesMaskImprSrc(b *testing.B) {
	for i := 0; i < b.N; i++ {
		RandStringBytesMaskImprSrc(n)
	}
}

以上是关于golang连续生成随机数重复的主要内容,如果未能解决你的问题,请参考以下文章

golang 文件上传图片名字的随机生成

numpy生成随机数组,超几何分布与连续分布

GO GOLANG 生成范围随机数

怎样用C语言生成10个1到100的不重复的随机数?

golang 生成随机数

golang学习记录:golang生成符合正态分布的随机数