Los generadores lineales congruentes, aunque no son de alta calidad, son fáciles de hacer compactos. Aquí hay una implementación en C:
uint32_t rand () {
estático uint64_t x = 3333;
retorno (x = (x * 16807)% 2147483647);
}
El uso de un tipo de 64 bits internamente nos evita tener que lidiar con el desbordamiento, pero podemos usar solo tipos de 32 bits, como muestra este ejemplo de Wikipedia: Generador de números aleatorios de Lehmer – Wikipedia
- ¿Qué tan útil es el algoritmo genético?
- ¿Cuál sería su selección de 20 problemas en algoritmos de clasificación (6 problemas de nivel básico, 6 problemas de nivel medio y 8 difíciles) para que resolver esos 20 le daría la máxima comprensión sobre la clasificación?
- Hay libros que enseñan estructuras de datos y algoritmos a través de un lenguaje de programación y otros simplemente enseñan la teoría; cual me recomiendan
- Visión por computadora: ¿Qué parámetros se pueden usar para medir qué tan similares son dos imágenes?
- ¿Cómo funciona LSH, 'hashing local sensible', para calcular el valor de hash?
Esto es difícil de superar. En el recuento de caracteres, podría hacerse un poco más compacto, pero en términos de instrucciones, esto es tan poco como podría desear, a menos que pueda leer un registro de hardware que es una fuente aleatoria. Pero, utiliza dos operaciones costosas (multiplicación y módulo).
Una solución que podría ser mejor en algunos casos es obtener los bits bajos de un temporizador o reloj. En Python:
datetime.now (). microsegundo
es aproximadamente aleatorio, si solo lo llama de vez en cuando, en un horario irregular. Sin embargo, las llamadas repetidas obviamente devuelven números similares. Pero en un entorno integrado, a veces verá esto (aunque es una mala idea porque es predecible y controlable).
En los procesadores Intel de la familia Ivy Bridge (o posterior) hay una sola instrucción que genera un número aleatorio. Con GCC, esto está disponible como intrínseco:
unsigned int __builtin_ia32_rdrand32_step (unsigned int *)
Puede compilarse en un código de operación de 3 bytes.