Numeri Casuali
I numeri casuali compaiono in molti ambiti applicativi e il package math/rand
ne fornisce le funzioni.
I numeri in realtà sono pseudocasuali e vengono generatida un algoritmo deterministico a partire da un seme iniziale.
Il seme può essere iniettato, per esempio prendendolo dal timestamp corrente.
(519random-numbers.go):
package main
import "time"
import "fmt"
import "math/rand"
func main() {
// Numeri casuali interi 0<= n < 100
fmt.Print(rand.Intn(100), ", ")
fmt.Print(rand.Intn(100))
fmt.Println()
// Numero casuale float 0.0 <= f < 1
fmt.Println(rand.Float64())
// Con scala e shift: 5.0 <= f < 10
fmt.Print((rand.Float64()*5)+5, ", ")
fmt.Print((rand.Float64() * 5) + 5)
fmt.Println()
// Dato che l'algoritmo dei numeri casuali è deterministico
// è meglio generare una sorgente di 'seed'
// per esempio col tempo in nanosecondi
s1 := rand.NewSource(time.Now().UnixNano())
// E' generato r1 che usa il seed s1
r1 := rand.New(s1)
// E' r1 che genera i numeri casuali
fmt.Print(r1.Intn(100), ", ")
fmt.Print(r1.Intn(100))
fmt.Println()
// A parità di seed la sequenza di random è la stessa
s2 := rand.NewSource(42)
r2 := rand.New(s2)
fmt.Print(r2.Intn(100), ", ")
fmt.Print(r2.Intn(100))
fmt.Println()
s3 := rand.NewSource(42)
r3 := rand.New(s3)
fmt.Print(r3.Intn(100), ", ")
fmt.Print(r3.Intn(100))
fmt.Println()
}
La funzione NewSource
genera un seed per i numeri casuali, con argomento un Numero intero. Questo viene spesso preso dal timestamp corrente espresso in nanosecondi.
Dopo la generazione del seed occore creare un oggetto generatore di numeri random basato sul seed.