I am trying to generate random numbers (integers) in Go, to no avail. I found the rand
package in crypto/rand
, which seems to be what I want, but I can't tell from the documentation how to use it. This is what I'm trying right now:
b := []byte{}
something, err := rand.Read(b)
fmt.Printf("something = %v\n", something)
fmt.Printf("err = %v\n", err)
But unfortunately this always outputs:
something = 0
err = <nil>
Is there a way to fix this so that it actually generates random numbers? Alternatively, is there a way to set the upper bound on the random numbers this generates?
As of 1 april 2012, after the release of the stable version of the lang, you can do the following:
import "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 }
Depending on your use case, another option is the
math/rand
package. Don't do this if you're generating numbers that need to be completely unpredictable. It can be helpful if you need to get results that are reproducible, though -- just pass in the same seed you passed in the first time.Here's the classic "seed the generator with the current time and generate a number" program:
crypto/rand
provides only binary stream of random data, but you can read integers from it usingencoding/binary
: