我试图在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会在一定时间内带来相同的随机数,因此循环会一次又一次地迭代。如何改善我的代码?
time
每次设置相同的种子,您将获得相同的序列。因此,当然,如果您将种子设置为快速循环中的时间,则可能会多次调用相同的种子。
在您的情况下,在您调用randInt函数直到拥有不同的值之前,您正在等待时间(由Nano返回)。
randInt
对于所有伪随机库,您只需设置一次种子,例如在初始化程序时,除非您特别需要重现给定的序列(通常仅用于调试和单元测试)。
之后,您只需调用Intn即可获取下一个随机整数。
Intn
将rand.Seed(time.Now().UTC().UnixNano())行从randInt函数移至main的开头,一切将会更快。
rand.Seed(time.Now().UTC().UnixNano())
还请注意,我认为您可以简化字符串的构建:
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) }