Aleatorizacion o ramdom en los micro

#1
Habitualmente suelo usar para muchas cosas en programacion (C/C++) la aleatorizacion, o el ramdon. Normalmente en C esto se hace variable = time(null) y luego se llama a una funcion llamada srand(otros parametros). Esto es muy importante e imprescindible en muchas ocasiones, para juegos, para generar suerte, etc. Necesito implementar esto en un pic, pero no veo nada en el cc5 que me hable de ello, se puede hacer, existe? Gracias:rolleyes:
 
#2
En realidad no existe... ni para las computadoras grandes... lo que se hace es una funcion "pseudoaleatoria" que en realidad es una ecuacion que siempre genera el mismo numero apartir de una "semilla", posteriormente el resultado se vuelve a usar como la siguiente semilla y asi sucesivamente, asi que la salida es altamente aleatoria, pero se repetira si vuelves a colocar la primer semilla

En los PICs programar una funcion asi consume muchos recursos, asi que se usan otras medidas, una que me gusta hacer es medir el tiempo de pulsacion de un boton y con eso buscar un valor en una tabla de busqueda donde coloque valores al azar... al cambiar el tiempo en que se presiona el boton y al tener una tabla de valores aleatorios se obtiene una buena funcion de azar..

Otras veces se adquere un valor semilla de un convertidor AD, o de algun timer o de alguna transmision serial, la idea es buscar algo que sea suficientemente aleatorio para poder iniciar una busqueda en una tabla..
 
#3
En realidad no existe... ni para las computadoras grandes... lo que se hace es una funcion "pseudoaleatoria" que en realidad es una ecuacion que siempre genera el mismo numero apartir de una "semilla", posteriormente el resultado se vuelve a usar como la siguiente semilla y asi sucesivamente, asi que la salida es altamente aleatoria, pero se repetira si vuelves a colocar la primer semilla

En los PICs programar una funcion asi consume muchos recursos, asi que se usan otras medidas, una que me gusta hacer es medir el tiempo de pulsacion de un boton y con eso buscar un valor en una tabla de busqueda donde coloque valores al azar... al cambiar el tiempo en que se presiona el boton y al tener una tabla de valores aleatorios se obtiene una buena funcion de azar..

Otras veces se adquere un valor semilla de un convertidor AD, o de algun timer o de alguna transmision serial, la idea es buscar algo que sea suficientemente aleatorio para poder iniciar una busqueda en una tabla..
Hola Colega, pues el sistema de randomizar que ofreces, es muy efectivo, pero no es necesario acudir a una tabla, ya que el tiempo de presion del boton es variable, puedes usarlo para tal fin.-:)
 
#4
Si, es como dices Chico3001, es la semilla, asi lo llaman en el libro que estudio de 3 tomos, (Como programar en c/c++). Sin embargo Gudino Roberto duberlin, es cierto que si se mide una pulsacion con un reloj de 20Mhz, y esta pulzacion la contamos en microsegundos puede ser aleatoria, pero quizas el usuario tenga la habilidad de dar en el boton a tiempos exactos, o sea, pulsarlo siempre o casi siempre el mismo tiempo, parece dificil no?, no se cuanto?. De hecho para esto hasta existe tambien unas tarjetas PCI de "entropia" se usaron para este fin y para encriptacion tambien. Pero tengo una idea: Desde que el aparato arranque llevar el paso del tiempo e ir incrementando una variable en vez de por segundo, por microsengundo, uns16 de 0 a 65535, cuando llegue al limite comenzaria. Entonces, cuando el usuario presiona, se suma lo que se demoro, mas el numero que tenia la variable que se va incrementando en ese momento, y este numero es la cantidad de veces que el programa pasaria por todos los elementos que puden salir, o sea dando la vuelta si se acaban, luego pararia cuando acabe la cuenta y mostraria o haria esa obcion. Pero el tiempo que siempre cuenta el de 0-65535 sigue caminando siempre internamente. Asi si seria vien dificil de cogerle el tiempo con un pulsador cierto?
 
#5
Lo dificil es generar la semilla... una vez con esa la funcion es lo de menos... se pueden aplicar desde integrales hasta tablas de busqueda...

Depende mucho de los recursos disponibles, la dificultad para aleatorizar aun mas la semilla e incluso las ganas que uno tenga de programar una funcion extra...

algunas veces me he saltado la tabla y solo uso el tiempo de pulsacion... es completamente al gusto del cliente...
 
#7
si queres utilizar este RAMDOM, para una especie de "dado" o algo que el usuario pare ese random con un pulsador, lo unico que necesitas hacer es descontar una memmoria, desde cualquier valor al que vos lo desees, si el pulsador fue apretado, esa memoria es considerada como tu numero aleatorio ( que es aleatorio porque el micro al ir tan a las chapas, puede tocar cualquiera)
 
#8
En PIC CCS existe la funcion rand(N), que genera un numero entero aleatorio.

para poder inbocar necesitaras incluir en el inicio de programa la libreria stdlib.h

ejemplo:

#include <16f877a.h>
#include <stdlib.h>
#use delay(clock=20000000)

void main()
{
int numero;
port_b_pullups(true);
set_tris_b(0b00000001); ///pin RB0 como entrada
set_tris_d(0b00000000); ///puerto d como salidas
denuevo:
while(input(pin_b0)==1)
{
numero=rand();
output_d(numero);
delay_ms(300);
}
goto denuevo;
}

el programa anterior genera un numero aleatorio entre 0 y 255, el resultado sale por el puerto D en binario.

si un pulsante es conectado al pin RB0 podra detenerse el bucle y capturar el numero presente en los pines del puerto (juego muy utilizado en los programas concurso que asoman en la tele)... para visualizar el estado del puerto D pueden colocar LEDS en los pines del puerto.

incluyo simulacion y programa para que lo revisen
 

Adjuntos

Arriba