Autor Tema: hay alguna secuencia de randomizado?  (Leído 2827 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado fastyx

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 353
hay alguna secuencia de randomizado?
« en: 06 de Marzo de 2006, 17:31:00 »
Amigos:

necesito hacer que 3 motores se prendan al mismo tiempo,y se vayan apagando uno a los 18 seg,otro a los 19 y el ultimo a los 20 seg.

esto lo hice consentencias for

ahora: es posible contar con alguna instruccion que cambie el orden de apagado en forma aleatoria?

desde ya muchas gracias!!

lo que deseo en esta funcion es apagar led led1 y led2 con secuencias diferentes cada vez y randomizadas

tiempo()
{

int32 i=0;

ini( );

        for(i=0;i<200000;i++)
   
        {
         led=1;led1=1;led2=1;
         valor=(read_adc());    
         set_pwm1_duty(valor);  
        }                    

i=0;
         for(i=0;i<10000;i++)

       {
         led=0;
         valor=(read_adc());
         set_pwm1_duty(valor);
       }

i=0;
         for(i=0;i<10000;i++)

       {
         led1=0;
         valor=(read_adc());
         set_pwm1_duty(valor);
       }

i=0;
         for(i=0;i<10000;i++)

       {
         led2=0;
         valor=(read_adc());
         set_pwm1_duty(valor);
       }
}//tiempo

Desconectado Khronos_Nieto

  • Colaborador
  • PIC10
  • *****
  • Mensajes: 40
RE: hay alguna secuencia de randomizado?
« Respuesta #1 en: 06 de Marzo de 2006, 18:45:00 »
Hola fastyx.

Yo creo que para hacer un random "autentico", debe de intervenir algo realmente aleatorio.

Se me ocurre poner un temporizador a contar indefinidamente y que capture el valor cuando se pulse un pulsador externo.
En funcion de ese valor se opera con él y en que orden se apagaran los motores.

No se me ocurre nada en lo que no tenga que intervenir un parametro no predecible. Y la pulsacion es lo menos predecible que hay.


Saludos.
"Camaradas, ni nuestro propio conocimiento conoce nuestro potencial"
- La caza del Octubre Rojo -

Desconectado fastyx

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 353
RE: hay alguna secuencia de randomizado?
« Respuesta #2 en: 06 de Marzo de 2006, 19:05:00 »
lo que decis es cierto,ahora lo que me pidio esta gente es que al cabo de ese tiempo
lo que cambie es en que secuencia apagan,pero sin intervencion externa.

quise leer la funcion rand() en la ayuda del css pero la explicacion es muy escueta

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: hay alguna secuencia de randomizado?
« Respuesta #3 en: 06 de Marzo de 2006, 22:08:00 »
Pues como te recomiendan es mejor usar variables aleatorias como el conteo del timer u otras en las que no puedas adivinar que valor va a salir.

La función rand() entrega un valor LONG que está entre 0 y RAND_MAX. RAND_MAX está definido en STDLIB.H.

#define RAND_MAX  32767    // The value of which is the maximum value
                           // ... returned by the rand function

No conviene usar esa función ya que el valor "aleatorio" que supuestamente entrega, tiene un orden. Siempre te va a salir lo mismo, no es tan aleatorio. Lo mejor es usar el timer.


----------------
RAND()
 

Syntax:
 re=rand()


Parameters:
 None

Returns:
 A pseudo-random integer.

 
Function:
 The rand function returns a sequence of pseudo-random integers in the range of 0 to RAND_MAX.

Availability:
 All devices

Requires
 #include <STDLIB.H>

Examples:
 int I;

I=rand();

Example Files:
 None

Also See:
 srand()

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: hay alguna secuencia de randomizado?
« Respuesta #4 en: 07 de Marzo de 2006, 10:53:00 »
No encuentro el post en el que ya se habló de la generación de una semilla realmente aleatoria, pero sí recuerdo una solución que podría servir:
se trata de utilizar como semilla el valor de la lectura de un pin del ADC cuando este pin está al aire, con lo cual su valor es impredecible.

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
RE: hay alguna secuencia de randomizado?
« Respuesta #5 en: 07 de Marzo de 2006, 11:40:00 »
Hola!!

srand() sirve para cambiar la semilla.

Nocturno... te refieres a pasarle como parámetro a "srand()" el valor de una conversión AD al aire para cambiar la semilla de la forma más aleatoria posible??


Un saludo desde Alicante.


Desconectado fastyx

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 353
RE: hay alguna secuencia de randomizado?
« Respuesta #6 en: 07 de Marzo de 2006, 14:04:00 »
nocturno:

 voy a explicarme mejor porque yo le llamo randomizar, pero en realidad es que se apaguen siempre en diferente secuencia los led 1, 2 y 3.

osea arrancan prendidos los 3 y luego de un tiempo x que se apague el1 el 2 el 3

en la otra marcha que se apague el 3 el 1 y el 2

y asi susecivamente.

lo que no se es lo del adc porque yo debo variar en realidad es entre esos 3 valores

123,321,132,312 etc

pregunto:se puede hacer correr un timer en modo contador pero hacerlo dar vueltas
de manera que cuente 123 y setee a 123 permanentemente?

porque de ser asi cuando el contador del bucle for llegue al numero de apagado,que tome el valor del timer en ese momento que puede ser o1 o2 o3,
y que lo ingrese como variable en la parte numerica de la variable led

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: hay alguna secuencia de randomizado?
« Respuesta #7 en: 07 de Marzo de 2006, 16:28:00 »
Cuando yo hice un dado electrónico lo hice con el contador del timer, en un AVR pero para el caso es lo mismo. Simulaba estados random.

Para empezar necesitas saber cuántos estados aleatorios necesitas; como tú dices: 123,321,132,312,231 y 213 (serían 6 estados).

En mi caso fueron 6: 1,2,3,4,5 y 6 (las 6 caras del dado).

El contador del timer era de 8bits, entonces cuando el usuario apretaba un botón, se obtenía el conteo, que podía ser de 0 a 255.

Para obtener los 6 estados de los 256 números posibles se puede hacer una división. Digamos que cae en 137...

137 / 6 = 22.833 (veintidós enteros cinco sextos)

Tomas el residuo 0.833, lo multiplicas por 6 y te da 5. En este caso el estado aleatorio cayó en 5, de 6 estados posibles: 0,1,2,3,4 y5.

Si haces una subrutina que seleccione los estados, tendría que ser para el número de estados que obtendrás (256 si es con un timer de 8bit) dividido entre los estados que deseas (tú tienes 6: 123,321,132,312,231,213). El residuo lo asignarás al estado que quieras:

1 - 123
2 - 321
3 - 132
4 - 312
5 - 231
6 - 213


Esa asignación la puedes hacer con un switch case.

Esto se haría en C así:

int16 random;
random=read_adc();
random=random%6; //creo que así se saca el residuo
switch (random)
...

Esa es una forma de hacer variables aleatorias y reducir el número de estados obtenibles de ellas.

Espero ser claro, porque lo leo y lo veo un poco confuso.

Si hicieras este método, el conteo del timer no es la solución, ya que siempre te saldrían los mismos valores del contador del timer. La solución es usar el pin abierto ADC que recomienda Nocturno, ya que siempre será un valor completamente aleatorio y no dependerá ni del PIC, ni de la presión de un botón por parte del usuario.

En el caso del ADC, sí éste es de 10bits, tendrás valores de 0 a 1023. Divides el que te entrega el PIC entre tus estados deseados y listo. Sonrisa Gigante

Desconectado fastyx

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 353
RE: hay alguna secuencia de randomizado?
« Respuesta #8 en: 07 de Marzo de 2006, 19:58:00 »
Migsantiago:

te agradezco que te hayas tomado la molestia de analizar mi caso.

conceptualmente lo entiendo ,voy a tener que masticarlo para poder implementarlo
pero nunca se me habia ocurrido tomar los 6 estados.

gracias !!!!

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: hay alguna secuencia de randomizado?
« Respuesta #9 en: 07 de Marzo de 2006, 20:21:00 »
Qué bien.

De hecho la lista de los estados debería ser:

0 - 123
1 - 321
2 - 132
3 - 312
4 - 231
5 - 213

ya que en ninguna división entre 6 el residuo puede ser 6 Muchas risas