Generare numeri random in Go
Nella libreria standard di Go abbiamo il package math/rand che ci permette di generare valori random.
In questo articolo vediamo qualche esempio su come usarla.
Partiamo da quello più basico:
package main
import (
"fmt"
"math/rand"
)
func main() {
fmt.Println(rand.Intn(100))
}
Molto semplcimente restituisce un numero non oltre quello indicato.
Ma vediamo un esempio più utile, in qui facciamo lo shuffle di un array:
package main
import (
"fmt"
"math/rand"
)
func main() {
items := []string{"uno", "due", "tre", "quattro", "cinque"}
for i := range items {
newIndex := rand.Intn(len(items) - 1)
items[i], items[newIndex] = items[newIndex], items[i]
}
fmt.Println(items)
}
Funziona con una piccola issue: se lo eseguite varie volte, potete notare che restituisce sempre lo stesso ordinamento.
Per ovviare possiamo usare un seed per cambiare la sorgente di provenienza:
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
items := []string{"uno", "due", "tre", "quattro", "cinque"}
seed64 := time.Now().UnixNano()
source := rand.NewSource(seed64)
r := rand.New(source)
for i := range items {
newIndex := r.Intn(len(items) - 1)
items[i], items[newIndex] = items[newIndex], items[i]
}
fmt.Println(items)
}
Il package time lo usiamo solo per generare un valore da passare come source; potevamo mettercelo anche a mano volendo.
Enjoy!
go rand math time
Commentami!