如何正确播种随机数生成器
我试图在Go中生成一个随机字符串,这是我到目前为止编写的代码:
package mainimport (
"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 mainimport (
"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