Generating random numbers
(integers for the sake of this post)
Usually
Most commonly, you would use the math/rand and the time pkg to seed the rand generator in go. This is shown below:
// code#1 package main import ( "fmt" "math/rand" "time" ) func main() { rand.Seed(time.Now().UnixNano()) x := rand.Intn(5) // An int between [0,5) fmt.Println(x) }
Unusually
Most of times, code#1 will do the job, BUT what if your randomness cannot depend on time alone.
Problem
As an example, suppose you want to create a function that must return two random numbers between 0 and n
Thought 1
You could math/rand.Perm(n) seeded with time.Now().UnixNano() to obtain a slice of n integers. And then pick the first two. Something like:
//code#2 func main() { rand.Seed(time.Now().UnixNano()) x := rand.Perm(5) fmt.Println(x[0], x[1]) }
BUT, this is highly inefficient especially for large values of n.
Thought 2
Make use of the crypto/rand package to generate a truly random int.
Something like:
// code#3 package main import ( "fmt" "crypto/rand" "math/big" ) func main() { x, _ := rand.Int(rand.Reader, big.NewInt(5)) y, _ := rand.Int(rand.Reader, big.NewInt(5)) fmt.Println(x, y) }
That's all! Happy randomizing!
Top comments (0)