EDAboard.com | EDAboard.eu | EDAboard.de | EDAboard.co.uk | RTV forum PL | NewsGroups PL

funcion random

Nuevo Tema

elektroda.net NewsGroups Forum Index - Electronica ES - funcion random

Camilo
Guest

Mon Jun 11, 2007 6:52 pm   



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?

Eduardo
Guest

Mon Jun 11, 2007 8:39 pm   



Camilo wrote:
Quote:
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?

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.

Reinoso G
Guest

Mon Jun 11, 2007 10:10 pm   



Camilo wrote:

Quote:
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?

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:
http://en.wikipedia.org/wiki/Linear_feedback_shift_register
http://en.wikipedia.org/wiki/Linear_congruential_generator
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_at_wanado o.es

Eduardo
Guest

Tue Jun 12, 2007 3:19 pm   



On Jun 11, 5:39 pm, "Eduardo" <abdu...@tutopia.com> wrote:
Quote:
Camilo wrote:
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?

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.

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.

elektroda.net NewsGroups Forum Index - Electronica ES - funcion random

Nuevo Tema

Arabic versionBulgarian versionCatalan versionCzech versionDanish versionGerman versionGreek versionEnglish versionSpanish versionFinnish versionFrench versionHindi versionCroatian versionIndonesian versionItalian versionHebrew versionJapanese versionKorean versionLithuanian versionLatvian versionDutch versionNorwegian versionPolish versionPortuguese versionRomanian versionRussian versionSlovak versionSlovenian versionSerbian versionSwedish versionTagalog versionUkrainian versionVietnamese versionChinese version
RTV map EDAboard.com map News map EDAboard.eu map EDAboard.de map EDAboard.co.uk map