需要从字符串中提取随机字符
这是我得到的:
const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
b := make([]byte, 1)
for i := range b {
b[i] = letterBytes[rand.Intn(len(letterBytes))]
}
fmt.Println(string(b))
但它总是返回"X" 但是,每次使用 RAND 函数时,我都需要返回新字符。 任何帮助将不胜感激。 谢谢。
首先为伪随机数生成器设定种子。例如
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano())
const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
b := make([]byte, 7)
for i := range b {
b[i] = letterBytes[rand.Intn(len(letterBytes))]
}
fmt.Println(string(b))
}
输出:
jfXtySC
围棋游乐场
关于游乐场
在操场上,时间从 2009-11-10 23:00:00 UTC 开始 (确定此日期的重要性是 读者(。这使得通过给程序来更容易缓存程序 确定性输出。
因此,在 Go 操场中,time.Now().UnixNano()
始终返回相同的值。对于随机种子值,请在计算机上运行代码。
对于任何 Unicode 代码点(Go rune(,
package main
import (
"fmt"
"math/rand"
"time"
)
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano())
chars := []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ世界!@=")
r := make([]rune, 50)
for i := range r {
r[i] = chars[rand.Intn(len(chars))]
}
fmt.Println(string(r))
}
输出:
世QRYSp=@giJMIKly=tXRefjtVkeE!yHhTSQHvLyUYdRNIBbILW
你可能不需要cryto/rand。只需每次将种子设置为不同的内容即可。math/rand 包具有相同的种子是确定性的,因此您只需每次更改种子即可。假设这不是超级安全,只需添加此行。
rand.Seed(time.Now().Unix())
另请注意,如果您使用 play.golang.org 来测试它,则不会起作用,因为时间 pkg 在那里不起作用。它可以在其他任何地方正常工作。
如果您真的想要随机选择字符,请使用加密/兰特。阅读不是自制版本 - 如果需要,您可以在给定的字符范围内对其进行编码。最后,不要滚动自己的加密货币,以防万一这就是你在这里做的事情。