Generating random numbers over a range in Go

Golang has built-in support for random number generation in the standard library. Specifically there is the math/rand package which implements pseudo-random number generators.

However there is no function to generate a random integer between two defined values. But there is one that generates a random integer given between zero and a max value

func Intn(n int) int

func Intn(n int) int

Intn returns, as an int, a non-negative pseudo-random number in [0,n) from the default Source. It panics if n <= 0.

We can effectively use this function to generate a random number between two values


package main

import (
    "fmt"
    "math/rand"
)
        
func main() {
    min := 10
    max := 30
    fmt.Println(rand.Intn(max - min) + min)
} 

This thing works quite well, however if you try to run it several times you will see always the same number in output

Indeed on the official documentation we can read

Top-level functions, such as Float64 and Int, use a default shared Source that produces a deterministic sequence of values each time a program is run. Use the Seed function to initialize the default Source if different behavior is required for each run.

The proper example should then become


package main

import (
    "fmt"
    "math/rand"
    "time"
)
        
func main() {
    rand.Seed(time.Now().UnixNano())
    min := 10
    max := 30
    fmt.Println(rand.Intn(max - min + 1) + min)
}

Bear in mind, for random numbers suitable for security-sensitive work, use the crypto/rand package instead.

Join the Golang Developers Community on Golang Cafe