Probablemente el error sea una tontería, pero no lo encuentro
Quiero generar 8 números aleatorios diferentes entre 0 y 7, pero por alguna razón el último número siempre es igual al penúltimo y queda faltando un número.
El código usa un valor del Timer1 como semilla de una rutina generadora de números pseudo-aleatorios. La secuencia depende del timer1 en el momento en que se suelta el pulsador.
Anotación: La función RAND()%n; genera números entre 0 y (n-1)
La función SRAND; usa n como semilla generadora de la secuencia, si n se repite, la secuencia se repite.
Agradezco su colaboración. Espero que sirva el código si alguien lo necesita.
Quiero generar 8 números aleatorios diferentes entre 0 y 7, pero por alguna razón el último número siempre es igual al penúltimo y queda faltando un número.
El código usa un valor del Timer1 como semilla de una rutina generadora de números pseudo-aleatorios. La secuencia depende del timer1 en el momento en que se suelta el pulsador.
Anotación: La función RAND()%n; genera números entre 0 y (n-1)
La función SRAND; usa n como semilla generadora de la secuencia, si n se repite, la secuencia se repite.
Agradezco su colaboración. Espero que sirva el código si alguien lo necesita.
Código:
//----------------------------------------------------------------------------------------
#INCLUDE "16F877A.H"
#USE DELAY(CLOCK=4M)
#INCLUDE "LCD.C"
#INCLUDE "STDLIB.H"
UNSIGNED INT16 I=100;
INT X,Y;
INT DATOS[8];
VOID MAIN()
{
SETUP_TIMER_1(RTCC_INTERNAL|RTCC_DIV_64);
LCD_INIT();
WHILE(TRUE)
{
IF(INPUT(PIN_A0)==0)
{WHILE(INPUT(PIN_A0)==0){} // antirebote
SRAND(GET_TIMER1()); // Se toma el valor del Timer1 como semilla de la función RAND
FOR(X=0;X<=8;++X)
{DATOS[X]=20;} //Se ponen valores diferentes a los buscados en el Vector datos
FOR(X=1;X<=8;++X)
{OTRO_NUM:
DATOS[X]=RAND()%8; //Datos[x]= numero entre 0 y 7
FOR(Y=1;Y<=X-1;++Y)
{IF(DATOS[X]==DATOS[Y]) // Si Datos[x] es igual a algún valor anterior,
GOTO OTRO_NUM; //cambia su valor por otro número aleatorio
}}
LCD_PUTC("\f"); // Se borra la LCD
FOR(X=1;X<=8;++X)
{PRINTF(LCD_PUTC,"%U ",DATOS[X]);} // Se imprimen los valores del vector Datos
}}}
Última edición por un moderador: