Je suis nouveau sur Go et je ne sais pas pourquoi il imprime le même numéro pour rand.Intn(n int) int à chaque exécution:

package main

import (
    "fmt"
    "math/rand"
)


func main() {
    fmt.Println(rand.Intn(10)) 
}

La documentation dit:

Intn renvoie, sous la forme d'un int, un nombre pseudo-aléatoire non négatif dans [0, n) à partir de la source par défaut. Il panique si n <= 0.

Et comment semer correctement la génération de nombres aléatoires?

3
mjlowky 18 août 2017 à 12:38

2 réponses

Meilleure réponse

En appelant la fonction rand.Seed(), en lui passant une graine (aléatoire) ( typiquement l'horodatage Unix actuel). Citant le math/rand package doc:

Les fonctions de niveau supérieur, telles que Float64 et Int, utilisent une source partagée par défaut qui produit une séquence déterministe de valeurs chaque fois qu'un programme est exécuté. Utilisez la fonction Seed pour initialiser la source par défaut si un comportement différent est requis pour chaque exécution.

Exemple:

rand.Seed(time.Now().UnixNano())

Si rand.Seed() n'est pas appelé, le générateur se comporte comme s'il était initialisé par 1:

Seed utilise la valeur de départ fournie pour initialiser la source par défaut à un état déterministe. Si Seed n'est pas appelé, le générateur se comporte comme s'il avait été amorcé par Seed (1).

10
icza 18 août 2017 à 09:57
package main

import

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

func randomGen(min, max int) int {
rand.Seed(time.Now().Unix())
return rand.Intn(max - min) + min
}

func main() {
randNum := randomGen(1, 10)
fmt.Println(randNum)
}
1
elcomendante 28 déc. 2017 à 22:26