El paquete math/rand permite generar números pseudoaleatorios.
Así se genera un número entero aleatorio entre 0 y 99:
import "math/rand"
n := rand.Intn(100) // n is a random int, 0 <= n < 100
La función rand.Float64 devuelve un número de coma flotante aleatorio entre 0.0 y 1.0:
f := rand.Float64() // f is a random float64, 0.0 <= f < 1.0
También es posible barajar un slice (u otras estructuras de datos):
x := []string{"a", "b", "c", "d", "e"}
// shuffling the slice put its elements into a random order
rand.Shuffle(len(x), func(i, j int) {
x[i], x[j] = x[j], x[i]
})
Las secuencias de números que genera el paquete math/rand no son realmente aleatorias.
Dado un valor de «semilla» concreto, los resultados son totalmente deterministas.
En Go 1.20 y versiones posteriores, la semilla se elige automáticamente al azar, así que verás una secuencia de números aleatorios distinta cada vez que ejecutes tu programa.
En versiones anteriores de Go, la semilla era 1 por defecto.
Así que, para obtener secuencias distintas en cada ejecución del programa, tenías que establecer manualmente la semilla del generador de números aleatorios, por ejemplo con la hora actual, antes de obtener cualquier número aleatorio.
rand.Seed(time.Now().UnixNano())