In Go language, generating a random integer within a range is a common programming task, such as in games, simulations, or testing scenarios. Go's standard library math/rand provides powerful random number generation capabilities, but attention must be paid to initialization and range limitations.

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    // Initialize the random number seed to ensure different results each run
    rand.Seed(time.Now().UnixNano())
    
    // Generate a random integer between 0 and 99
    randomNum := rand.Intn(100)
    fmt.Println("Random integer:", randomNum)
}

Note: In Go 1.20 and later versions, rand.Seed has been deprecated. It is recommended to use rand.NewSource and rand.New to create independent random number generators.

Using the rand.Intn Function

The rand.Intn(n) function returns a random integer in the range [0, n), where n is the upper limit (exclusive). For example, to generate a random integer between 1 and 10, you can adjust the range.

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    rand.Seed(time.Now().UnixNano())
    
    // Generate a random integer from 1 to 10
    min := 1
    max := 10
    randomNum := rand.Intn(max - min + 1) + min
    fmt.Println("Random integer (1-10):", randomNum)
}

In this example, rand.Intn(max - min + 1) generates a random number from 0 to 9, then adds min to shift it to the range of 1 to 10.

Generating Random Integers in a Specified Range

For any integer range [a, b], you can use the general formula: rand.Intn(b - a + 1) + a. Below is a more flexible example.

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func generateRandomInRange(min, max int) int {
    if min > max {
        min, max = max, min // Swap to ensure min <= max
    }
    return rand.Intn(max - min + 1) + min
}

func main() {
    rand.Seed(time.Now().UnixNano())
    
    // Generate a random integer from -50 to 50
    randomNum := generateRandomInRange(-50, 50)
    fmt.Println("Random integer (-50 to 50):", randomNum)
}

Tip: The function generateRandomInRange handles cases where input parameters are in the wrong order, ensuring a valid range.

Using crypto/rand to Generate Secure Random Numbers

If the application requires cryptographically secure random numbers (such as generating keys), the crypto/rand package should be used. It provides the rand.Int function to generate random integers over a large range.

package main

import (
    "crypto/rand"
    "fmt"
    "math/big"
)

func main() {
    // Generate a random integer from 0 to 999
    max := big.NewInt(1000)
    randomNum, err := rand.Int(rand.Reader, max)
    if err != nil {
        panic(err)
    }
    fmt.Println("Secure random integer:", randomNum)
}

The performance of crypto/rand is generally lower than that of math/rand, but it is suitable for security-sensitive scenarios.