2011-11-27 12 views
9

Esiste qualche funzione Vai che restituisce un vero numero pseudo casuale in ogni esecuzione? Ciò che intendo in realtà è considerare il seguente codice,Difficoltà con pacchetto Go Rand

package main 

import (
    "fmt" 
    "rand" 
) 

func main() { 
    fmt.Println(rand.Int31n(100)) 
} 

Ogni volta che eseguo questo codice, ottengo lo stesso risultato. Esiste un metodo che restituirà risultati casuali diversi ogni volta che viene chiamato?

risposta

13

Il pacchetto rand può essere utilizzato per generare numeri pseudo-casuali, che sono generati sulla base di uno specifico valore iniziale (chiamato "seme").

Una scelta popolare per questo seme iniziale è ad esempio l'ora corrente in nanosecondi, un valore che probabilmente differirà quando si esegue il programma più volte. È possibile inizializzare il generatore di numeri casuali con l'ora attuale con qualcosa di simile:

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

(non dimenticate di importare il pacchetto time per questo)

C'è anche un altro pacchetto denominato crypto/rand che può essere utilizzato per generare valori casuali migliori (questo generatore potrebbe anche prendere in considerazione i movimenti del mouse dell'utente, il calore attuale del processore e molti altri fattori in considerazione). Tuttavia, le funzioni in questo pacchetto sono diverse volte più lente e, a meno che non si scriva un generatore di passphrase (o altro materiale relativo alla sicurezza), il pacchetto rand normale probabilmente sta bene.

+2

Un'altra utile proprietà di plain rand è la possibilità di riprodurre i risultati riutilizzando un seed. –

+1

Con go1 time.Nanoseconds() non sembra esistere. Puoi usare rand.Seed (time.Now(). UnixNano()) – Blacksad

1

Devi seminare prima il RNG.

Non ho mai usato Go, ma probabilmente è rand.Seed(x);

+0

Vuoi dire che questo, il pacchetto principale importazione "fmt" importazione "Rand" func main() { rand.Seed (100); \t fmt.Println (rand.Int31n (100)) }. Sta anche dando lo stesso risultato per tutta la corsa. – Arpssss

+0

Ecco perché lo si semina con il numero statico 100 :-) Prova a utilizzare qualcosa di più unico, ad esempio l'ora corrente in millisecondi. –

0

rand.Seed(time.Now().UnixNano()) funziona su Ubuntu. Ho speso per sempre alla ricerca di rand.Seed(time.Nanoseconds()). Alla fine ho trovato l'esempio: Ricerca Google 2.1 nel tour di golang.