2011-11-27 9 views
9

¿Hay alguna función Ir que devuelva un número pseudo aleatorio verdadero en cada ejecución? Lo que en realidad es decir, consideran siguiente código,Dificultad con el paquete Go Rand

package main 

import (
    "fmt" 
    "rand" 
) 

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

Cada vez que ejecuta este código, me da la misma salida. ¿Hay algún método que arroje resultados diferentes y aleatorios cada vez que se llame?

Respuesta

13

El paquete rand se puede utilizar para generar números pseudoaleatorios, que se generan en base a un valor inicial específica (llamada "semilla").

Una opción popular para esta semilla inicial es, por ejemplo, la hora actual en nanosegundos, un valor que probablemente difiera cuando ejecute su programa varias veces. Puede inicializar el generador de números aleatorios con la hora actual con algo como esto:

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

(no se olvide de importar el paquete time para eso)

También hay otro paquete llamado crypto/rand que puede ser utilizado para generar mejores valores aleatorios (este generador también puede tomar los movimientos del mouse del usuario, el calor actual del procesador y muchos otros factores en cuenta). Sin embargo, las funciones de este paquete son varias veces más lentas y, a menos que no se escriba un generador de frases de paso (u otras cosas relacionadas con la seguridad), el paquete de rand normal probablemente sea correcto.

+2

Otra propiedad útil de plain rand es que puede reproducir los resultados al reutilizar una semilla. –

+1

Con go1 time.Nanoseconds() no parece existir. Puede usar rand.Seed (time.Now(). UnixNano()) – Blacksad

1

Primero debe sembrar el RNG.

nunca he utilizado Go, pero es probable que rand.Seed(x);

+0

¿Quiere decir esto, paquete principal importación "FMT" importación "rand" principal func() { rand.Seed (100); \t fmt.Println (rand.Int31n (100)) }. También está dando la misma salida durante todo el recorrido. – Arpssss

+0

Eso es porque lo está sembrando con el número estático 100 :-) Intente usar algo más único, como la hora actual en milisegundos. –

0

rand.Seed(time.Now().UnixNano()) funciona en Ubuntu. Pasé una eternidad investigando rand.Seed(time.Nanoseconds()). Finalmente encontré el Ejemplo: Búsqueda de Google 2.1 en la gira de golang.