funcion random

Buen dia a todos! les pregunto: como seria el algoritmo o codigo para la funcion random en el lenguaje ensamblador? (RISC) Como se genera la "semilla" (seed) de esta funcion en assembler?

Reply to
Camilo
Loading thread data ...

La generacion de la secuencia pseudoaleatoria generalmente se hace mediante una operacion matematica y guardas parte del resultado como semilla siguiente. La operacion puede multiplicar, dividir, elevar al cuadrado... lo que sea comodo. El el caso de programacion en assembler lo mas practico es ir desplazando un registro de 16/32/64 bits donde el bit entrante es una una OR-exclusiva con bits fijos del registro. Hay combinaciones de bits que generan secuencias mas 'aleatorias' que otras, puedes googlear ejemplos de generacion de codigos CRC ,se encuentran en C y Assembler en dos sabores, con y sin tablas de lookup.

Para la semilla se aprovecha algun evento aleatorio, como el instante en que se pulsa una tecla, su duracion, el momento de encendido.... en fin, lo mas comodo de acuerdo al hardware disponible, o sea, se produce un evento humano y guardas el contenido de un contador rapido como semilla.

El problema es cuando no hay ningun evento externo aleatorio, en ese caso, lo mas practico es grabar la flash con cualquier semilla e ir guardando los valores devueltos como nuevas semillas en la EEROM (estoy suponiendo que se trata de una implementacion con PIC o simil).

Eduardo.

Reply to
Eduardo

A parte de lo que ya te han comentado de cómo se guarda la semilla, investiga estos temas:

Linear Feedback Shift Registers y Linear congruential generator

puedes empezar por ejemplo mirando:

formatting link
formatting link
y visitando los enlaces externos.

El primero es más cómodo de implementar en ensamblador. El segundo es más versátil pero necesitas operar más y por tanto es más fácil de hacer en un lenguaje de más alto nivel.

Para generar la semilla puedes usar el timer interno del procesador, o basarte en las acciones del usuario (por ejemplo el tiempo en microsegundos que se tiene pulsando un botón o el intervalo entre pulsaciones). O proporcionar una semilla en tiempo de compilación y guardar el último número de la secuencia generada para usarlo de semilla en las próximas ejecuciones.

--
Saludos.
Reinoso G.
rei noso.b ao@wanado o.es
Reply to
Reinoso G

Ah, si se trata de generar solamente un numero aleatorio como respuesta a un evento externo no repetitivo, solamente hay que tener un contador a una frecuencia alta, hacer una lectura al producirse el evento y eliminar los bits mas significativos.

Por ejemplo, si quisiera hacer algo asi en una PC seria ejecutar simplemente la intruccion en assembler RDTSC ; Read Time Stamp Counter Devuelve en EDX:EAX el contenido de un contador de 64 bit que se incrementa con cada ciclo de reloj, con un procesador de 3GHz los ultimos bits resultan verdaderamente aleatorios (salvo tal vez los muy ultimos, no lo he testeado).

Eduardo.

Reply to
Eduardo

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.