Estoy tratando de generar números aleatorios (enteros) en el Go, fue en vano. He encontrado el rand paquete en crypto/rand, que parece ser lo que quiero, pero no puedo decir a partir de la documentación de cómo usarlo. Esto es lo que estoy intentando ahora mismo:

    b := []byte{}
    something, err := rand.Read(b)
    fmt.Printf("something = %v\n", something)
    fmt.Printf("err = %v\n", err)

Pero, por desgracia, siempre salidas:

    something = 0
    err = <nil>

Hay una manera de arreglar esto por lo que en realidad genera números aleatorios? Alternativamente, hay una manera de establecer el límite superior de los números aleatorios esto genera?

  • Yo esperaría que la rutina de llenar la matriz b con bytes aleatorios, sin embargo muchos de los que usted pidió.
  • Yo también estoy casi nuevo para Ir y no estoy familiarizado con las convenciones de llamada o similares.
  • Se sentirá b sin embargo b es un vacío de la rebanada (y el soporte de la matriz tiene tamaño 0). Así rand.Leer() no tienen espacio para guardar cualquier cosa, y devuelve 0 en su something variable que indica nada se almacenan. b := make([]byte,4) hubiera sido más apropiado, permitiendo a rand.Leer a la tienda de 4 bytes en la b
InformationsquelleAutor Chris Bunch | 2011-05-30

3 Comentarios

  1. 24

    crypto/rand sólo proporciona flujo binario de datos aleatorios, pero usted puede leer enteros usando encoding/binary:

    package main
    
    import "encoding/binary"
    import "crypto/rand"
    
    func main() {
        var n int32
        binary.Read(rand.Reader, binary.LittleEndian, &n)
        println(n)
    }
    • Genial, que trabajó para mí. Gracias!
    • usted debe comprobar error en binario.Leer?
    • He intentado esto en el patio de recreo y obtener siempre el mismo resultado: play.golang.org/p/Bh-f4QEyKf
    • La salida se almacena en la caché del sitio. No re-ejecutar el mismo programa de nuevo.
  2. 27

    Dependiendo de su caso, otra opción es el math/rand paquete. No hagas esto si tienes la generación de números que necesita para ser completamente impredecible. Puede ser útil si usted necesita para obtener resultados reproducibles, aunque-sólo tiene que pasar en la misma semilla que pasa en el primer tiempo.

    Aquí está el clásico «la semilla del generador con la hora actual y generar un número» programa:

    package main
    
    import (
        "fmt"
        "math/rand"
        "time"
    )
    
    func main() {
        rand.Seed(time.Now().Unix())
        fmt.Println(rand.Int())
    }
  3. 16

    A partir del 1 de abril de 2012, después de la liberación de la versión estable de la lang, puede hacer lo siguiente:

    package main

    import "fmt" import "time" import "math/rand"

    func main() { rand.Seed(time.Now().UnixNano()) //takes the current time in nanoseconds as the seed fmt.Println(rand.Intn(100)) //this gives you an int up to but not including 100 }

    • Esto es bastante más de lo que me espera a la hora de pedir los números pseudo-aleatorios. time.Now().Unix() no acaba de ser suficiente como UnixNano() hace.

Dejar respuesta

Please enter your comment!
Please enter your name here