如何正确播种随机数生成器

我试图在Go中生成一个随机字符串,这是我到目前为止编写的代码:

package main

import (

"bytes"

"fmt"

"math/rand"

"time"

)

func main() {

fmt.Println(randomString(10))

}

func randomString(l int) string {

var result bytes.Buffer

var temp string

for i := 0; i < l; {

if string(randInt(65, 90)) != temp {

temp = string(randInt(65, 90))

result.WriteString(temp)

i++

}

}

return result.String()

}

func randInt(min int, max int) int {

rand.Seed(time.Now().UTC().UnixNano())

return min + rand.Intn(max-min)

}

我的执行速度很慢。使用进行播种time会在一定时间内带来相同的随机数,因此循环会一次又一次地迭代。如何改善我的代码?

回答:

每次设置相同的种子,您将获得相同的序列。因此,当然,如果您将种子设置为快速循环中的时间,则可能会多次调用相同的种子。

在您的情况下,在您调用randInt函数直到拥有不同的值之前,您正在等待时间(由Nano返回)。

对于所有伪随机库,您只需设置一次种子,例如在初始化程序时,除非您特别需要重现给定的序列(通常仅用于调试和单元测试)。

之后,您只需调用Intn即可获取下一个随机整数。

rand.Seed(time.Now().UTC().UnixNano())行从randInt函数移至main的开头,一切将会更快。

还请注意,我认为您可以简化字符串的构建:

package main

import (

"fmt"

"math/rand"

"time"

)

func main() {

rand.Seed(time.Now().UTC().UnixNano())

fmt.Println(randomString(10))

}

func randomString(l int) string {

bytes := make([]byte, l)

for i := 0; i < l; i++ {

bytes[i] = byte(randInt(65, 90))

}

return string(bytes)

}

func randInt(min int, max int) int {

return min + rand.Intn(max-min)

}

以上是 如何正确播种随机数生成器 的全部内容, 来源链接: utcz.com/qa/411434.html

回到顶部