38 - Biblioteca estándar de Go: paquete math/rand

Para generar valores aleatorios el lenguaje Go proporciona el paquete estándar math/rand que nos proporciona esta funcionalidad.

La primer función que veremos de este paquete se llama rand.Intn:

    x := rand.Intn(100)

La función Intn retorna un un valor aleatorio comprendido entre 0 y el valor que le pasamos como parámetro -1.

Problema 1:

Generar 200 valores aleatorios comprendidos entre 0 y 100.

Programa: ejercicio160.go

package main

import (
    "fmt"
    "math/rand"
)

func main() {
    var ale int
    for f := 0; f < 200; f++ {
        ale = rand.Intn(101)
        fmt.Print(ale, "-")
    }	
}

La lista de valores que se genera es aleatorio pero es siempre la misma lista.

Para generar listas de valores aleatorios que cambien en cada ejecución del programa requiere que definamos una semilla inicial.

Programa: ejercicio161.go

package main

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

func main() {
    r := rand.New(rand.NewSource(time.Now().UnixNano()))
    var ale int
    for f := 0; f < 200; f++ {
        ale = r.Intn(101)
        fmt.Print(ale, "-")
    }	
}

Llamamos a la función New que nos retorna un puntero del tipo de dato struct Rand:

func New(src Source) *Rand

Debemos pasar como parámetro una variable de tipo Source que lo obtenemos llamando a la función NewSource que también pertenece al paquete rand:

    r := rand.New(rand.NewSource(time.Now().UnixNano()))

A la función NewSource le debemos enviar la semilla inicial y tomamos como valor la hora Unix que cambiará en cada ejecución del programa.

Ahora debemos llamar al método Intn del struct r que creamos antes del for:

    for f := 0; f < 200; f++ {
        ale = r.Intn(101)
        fmt.Print(ale, "-")
    }	

Para consultar otras funcionalidades del paquete math/rand podemos visitar : Paquete math/rand