Generare numeri random in Go

Mattepuffo's logo
Generare numeri random in Go

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!


Condividi

Commentami!