# To the point - generating random numbers in golang

### HM ・1 min read

## 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!