El paquete rand64 proporciona generadores de números pseudoaleatorios que producen números de 64 bits sin signo en el rango [0, 2 64 ).
Las implementaciones para los siguientes generadores de números pseudoaleatorios se proporcionan en sus propios paquetes:
Estos generadores implementan rand.Source64, por lo que pueden usarse como fuente para rand.Rand (a partir de Go 1.8).
Tenga en cuenta que algunos algoritmos utilizan el paquete de bits de Go 1.9.
La creación de un PRNG se ve así:
// create a source with the xoshiro256**
source := &xoshiro.Rng256SS{}
// use it as a source in rand.New
rng := rand.New(&source)
// Seed it from a single int64 (negative values are accepted)
rng.Seed(int64Seed)
Esta es una versión de incremento fijo del generador SplittableRandom de Java 8. Consulte también la página sobre Generadores rápidos de números pseudoaleatorios divisibles.
Implementación de Go basada en una implementación de referencia en C de Sebastiano Vigna.
Período 2 256 -1
Según los autores del algoritmo:
xoshiro256** (XOR/shift/rotate) es nuestro generador sólido y multipropósito (aunque no es un generador criptográficamente seguro). Tiene una velocidad excelente (sub-ns), un espacio de estado (256 bits) que es lo suficientemente grande para cualquier aplicación paralela y pasa todas las pruebas que conocemos.
Sin embargo, si uno tiene que generar solo números de punto flotante de 64 bits (extrayendo los 53 bits superiores), xoshiro256+ es un generador ligeramente (≈15%) más rápido con propiedades estadísticas análogas. Para uso general, hay que considerar que sus bits más bajos tienen una complejidad lineal baja y no pasarán las pruebas de linealidad; sin embargo, una baja complejidad lineal apenas puede tener impacto en la práctica, y ciertamente no tiene ningún impacto si se generan números de punto flotante utilizando los bits superiores (calculamos una estimación precisa de la complejidad lineal de los bits más bajos).
Período 2 128 -1
Según los autores del algoritmo:
xoroshiro128** (XOR/rotate/shift/rotate) y xoroshiro128+ tienen la misma velocidad que xoshiro256 y usan la mitad del espacio; Se aplican los mismos comentarios. Son adecuados sólo para aplicaciones paralelas de baja escala; Además, xoroshiro128+ exhibe una leve dependencia en los pesos de Hamming que genera una falla después de 5 TB de salida en nuestra prueba. Creemos que este ligero sesgo no puede afectar ninguna aplicación.
Implementación de Go basada en una implementación de referencia en C realizada por David Blackman y Sebastiano Vigna.
Para obtener más información, visita los generadores xoshiro/xoroshiro y la página de tiroteos de PRNG.
Periodo 2 128
Este es un generador congruencial permutado como se define en
PCG: una familia de algoritmos estadísticamente buenos, simples, rápidos y eficientes en el espacio para la generación de números aleatorios
Melissa E. O'Neill, Universidad Harvey Mudd
https://www.cs.hmc.edu/tr/hmc-cs-2014-0905.pdf
Si bien PCG
se refiere a toda una familia de algoritmos (consulte también http://pcg-random.org), el único algoritmo proporcionado es PCG XSL RR 128/64 LCG.
Implementación de Go basada en la implementación de referencia de C realizada por Melissa O'Neill y los contribuyentes del Proyecto PCG.
Periodo 2 19937 -1
Esta es una implementación de Go pura basada en la implementación mt19937-64.c C de Makoto Matsumoto y Takuji Nishimura.
Más información sobre el algoritmo Mersenne Twister y otras implementaciones están disponibles en http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
Tenga en cuenta que este algoritmo solo está destinado a aplicaciones que necesitan interoperabilidad con otras aplicaciones que utilizan este mismo algoritmo. Como se sabe que no pasa pruebas estadísticas triviales y es el más lento en AMD64, no se recomienda su uso para ningún otro propósito.
No es un PRNG real.
El paquete IoRand es un contenedor simple para leer flujos de bytes a través de io.Reader. Se puede utilizar como contenedor de crypto/rand para crear un rand.Source64 para el paquete math/rand:
package main
import (
"bufio"
crand "crypto/rand"
"encoding/binary"
"math/rand"
"github.com/db47h/rand64/v3/iorand"
)
// Wrap crypto/rand in an IoRand
func main () {
// first, wrap crypto/rand.Reader in a buffered bufio.Reader
bufferedReader := bufio . NewReader ( crand . Reader )
// Create the new IoRand Source
ior := iorand . New ( bufferedReader , binary . LittleEndian )
// use it as rand.Source64
rng := rand . New ( ior )
// get random numbers...
for i := 0 ; i < 4 ; i ++ {
_ = rng . Uint64 ()
}
}
Estos puntos de referencia se realizaron con go 1.12.5.
Algoritmo | AMD FX-6300 | Núcleo i5 6200U | BRAZO Cortex-A7 @900MHz |
---|---|---|---|
xoshiro256** | 5,53 ns/op. | 106,0 ns/operación | |
xoshiro256+ | 5,48 ns/operación | 86,1 ns/operativo | |
xoroshiro128** | 5,16 ns/operativo | 79,2 ns/operativo | |
xoroshiro128+ | 5,15 ns/operación | 62,7 ns/operativo | |
PCG XSL RR 128/64 LCG | 5,29 ns/op | 254,0 ns/operación | |
splitmix64 | 4,30 ns/op | 77,5 ns/operativo | |
Mersenne Twister 19937 | 8,82 ns/op | 136,0 ns/operación | |
Ir a matemáticas/rand | 7,01 ns/op | 68,4 ns/operativo |
Tenga en cuenta que los puntos de referencia muestran un rendimiento más lento en comparación con versiones anteriores. Esto se debe al hecho de que llamamos a Rng.Uint64 directamente en lugar de utilizar la interfaz rand.Rand64. Para poder hacer una comparación justa con el rng de la biblioteca estándar de Go, todos los puntos de referencia ahora pasan por una interfaz rand.Source64.
Manténgase alejado de splitmix64 y del venerable Mersenne-Twister 19937.
Se sabe muy poco sobre el math/rand de Go (ver aquí, aquí) y hay una propuesta para reemplazarlo con un generador PCG.
Los PCG, xoshiro256** y xoroshiro128** proporcionados tienen fama de pasar todas las pruebas conocidas; según sus respectivos autores. Sin embargo, tenga cuidado con el bajo rendimiento de este algoritmo PCG en particular en plataformas de 32 bits (afecta tanto a ARM como a x86).
rand64 admite módulos go. Las versiones anteriores 1.x y 2.x se trasladaron a sus respectivas ramas. Dado que las etiquetas semver sin go.mod parecían alterar los módulos go, las etiquetas para estas versiones se han restablecido.
Este paquete se publica bajo los términos de la licencia ISC (consulte el archivo LICENCIA en la raíz del repositorio). Además, el uso de los siguientes algoritmos se rige por licencias adicionales: