¿Cuáles son algunos de los códigos más pequeños que generan un número pseudoaleatorio?

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

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.

En una CPU Z-80, lea el registro de actualización. Eso es. (Depende del hardware, pero esa es la forma más fácil que puedo pensar que se puede hacer).

More Interesting

¿Por qué es necesario conocer la complejidad temporal de un programa?

¿Cuáles son algunos algoritmos divertidos para practicar?

¿Cuál es una versión más amigable para principiantes de CLRS para algoritmos de aprendizaje? ¿Estaría rompiendo la entrevista de codificación?

¿Debería un ingeniero que no sea CS aprender programación, algoritmos y estructuras de datos?

El año pasado, logré resolver dos problemas de ACM ICPC en las regiones. Ya que falta solo un mes para la competencia de este año, ¿puedo resolver uno o dos más este año si entreno duro hoy o no hay ninguna posibilidad?

¿Qué tipo de algoritmos se utilizan en DSP (plataforma del lado de la demanda)?

Cómo mejorar si he pasado 10 años aprendiendo programación pero aún no puedo resolver la mayoría de los problemas de algoritmos

En las preguntas que requieren el uso de estructuras de datos, ¿debemos usar STL o debemos definir la estructura de datos requerida manualmente? ¿Cual es mejor?

¿Cómo explicarías un 'arreglo' a un principiante en programación?

¿Cuál es la forma más eficiente de ordenar un millón de enteros de 32 bits?

Si existen múltiples rutas más cortas entre 2 nodos en un gráfico no dirigido, ¿es posible imprimirlas todas utilizando el algoritmo de Dijkstra?

Cómo convertirse en un maestro de algoritmos C y estructuras de datos

Cómo resolver el problema del "número mínimo de cortes"

¿Cuál será la complejidad temporal de la relación de recurrencia T (n-1) + T (n-2) + c?

¿Cuáles son algunas de las estructuras de datos / algoritmos de clasificación más interesantes?