我正在尝试在 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 函数的开头,一切都会变得更快。并失去.UTC()
致电自:
UnixNano 返回 t 作为 Unix 时间,即自 UTC 1970 年 1 月 1 日以来经过的纳秒数。
另请注意,我认为您可以简化字符串构建:
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().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)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)