我正在尝试在 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
在一定时间内带来相同的随机数,因此循环一次又一次地迭代。我怎样才能改进我的代码?
原文由 copperMan 发布,翻译遵循 CC BY-SA 4.0 许可协议
每次你设置相同的种子,你都会得到相同的序列。因此,当然,如果您将种子设置为快速循环中的时间,您可能会多次使用相同的种子调用它。
在你的情况下,当你调用你的
randInt
函数直到你有不同的值时,你正在等待时间(由 Nano 返回)改变。对于所有伪随机库,您只需设置一次种子,例如在初始化程序时,除非您特别需要重现给定的序列(通常仅用于调试和单元测试)。
之后,您只需调用
Intn
即可获得下一个随机整数。将
rand.Seed(time.Now().UTC().UnixNano())
行从 randInt 函数移动到 main 的开头,一切都会更快。并失去.UTC()
调用,因为:另请注意,我认为您可以简化字符串构建: