我试图在Go中生成随机数(整数),但无济于事.我找到了rand包crypto/rand,这似乎是我想要的,但我无法从文档中看出如何使用它.这就是我现在正在尝试的:
b := []byte{}
something, err := rand.Read(b)
fmt.Printf("something = %v\n", something)
fmt.Printf("err = %v\n", err)
Run Code Online (Sandbox Code Playgroud)
但不幸的是,这总是输出:
something = 0
err = <nil>
Run Code Online (Sandbox Code Playgroud)
有没有办法解决这个问题,以便它实际生成随机数?或者,有没有办法设置这个生成的随机数的上限?
Eva*_*haw 27
根据您的使用情况,另一个选项是math/rand包.如果您生成的数字需要完全不可预测,请不要这样做.如果您需要获得可重现的结果,这可能会有所帮助 - 只需传入您第一次传递的相同种子.
这是经典的"使用当前时间生成发电机并生成数字"程序:
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().Unix())
fmt.Println(rand.Int())
}
Run Code Online (Sandbox Code Playgroud)
Pio*_*zmo 24
crypto/rand仅提供随机数据的二进制流,但您可以使用encoding/binary以下方法从中读取整数:
package main
import "encoding/binary"
import "crypto/rand"
func main() {
var n int32
binary.Read(rand.Reader, binary.LittleEndian, &n)
println(n)
}
Run Code Online (Sandbox Code Playgroud)
Ibo*_*lit 16
截至2012年4月1日,在发布稳定版本的lang之后,您可以执行以下操作:
package mainimport "fmt" import "time" import "math/rand"
func main() { rand.Seed(time.Now().UnixNano()) // takes the current time in nanoseconds as the seed fmt.Println(rand.Intn(100)) // this gives you an int up to but not including 100 }