需要从字符串
中提取随机字符这是我得到的:
const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
b := make([]byte, 1)
for i := range b {
b[i] = letterBytes[rand.Intn(len(letterBytes))]
}
fmt.Println(string(b))
但它总是返回" X" 但是,我需要每次使用rand函数返回新角色。 任何帮助将非常感激。 感谢。
答案 0 :(得分:2)
首先播种伪随机数生成器。例如,
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
答案 1 :(得分:0)
你可能不需要cryto / rand。只需将种子设置为每次不同的东西。 math / rand包具有相同的种子确定性,因此您每次只需要更改种子。假设这不是超级安全,只需添加此行。
rand.Seed(time.Now().Unix())
另请注意,如果您使用play.golang.org测试它不会起作用,因为时间pkg在那里不起作用。它在其他任何地方都可以正常工作。
如果您确实想要随机选择字符,请使用crypto / rand。不是自制版本 - 如果您需要在给定字符范围内进行编码,则可以对其进行编码。最后,不要滚动你自己的加密,以防你在这里做的事情。