Autor Tema: rand no es totalmente aleatoria  (Leído 1535 veces)

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

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
rand no es totalmente aleatoria
« en: 29 de Febrero de 2016, 19:27:09 »
Esto es lo que estoy utilizando:

#include <STDLIB.H>/////////////para RAND();

int8 dato

*FOR(c1=0;200>c1;c1++)
{
dato=rand() % 201;//parece combeniente hacer esto antes de utilizar datos "reales-utiles" porque al principio tienden a                                                                                    //   repetirse mucho los mismos o ser similares  tipo  100 - 102 -102 - 45 - 96 - 95
}

main(){
//Es consecutivo 71,26,....yo mismo acabo perdiendome vasta con resetear el micro, suspender tarea, reiniciarla,  canviar el //200 del *FOR para que comienze con un resultado diferente, pero siempre empieza igual
dato = rand() % 201; //carga  0-200
............
............
}

Si esto es por fijacion de su reloj interno como lei al principio, hay alguna manera de que no se base en el????

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:rand no es totalmente aleatoria
« Respuesta #1 en: 29 de Febrero de 2016, 19:41:02 »
Citar
Si esto es por fijacion de su reloj interno como lei al principio, hay alguna manera de que no se base en el????

Para que algo sea realmente aleatorio, deberias tener una entrada aleatoria. Si no me equivoco ademas de la funcion rand, existe otra para setear la la semilla inicial (srand), lo cual te va a permitir que sea random, el tema esta en que esa semilla ahora tiene que ser aleatoria.

PD: Te parece random?

Código: C
  1. #include        <stdlib.h>
  2.  
  3. static  long    randx;
  4. static  char    randf;
  5.  
  6. void
  7. srand(unsigned x)
  8. {
  9.         randx = x;
  10.         randf = 1;
  11. }
  12.  
  13. rand(void)
  14. {
  15.         if(!randf)
  16.                 srand(1);
  17.         return((int)((randx = randx*1103515245L + 12345)>>16) & 077777);
  18. }

ahora tu problema es ... conseguir algo random para ponerle a srand()
« Última modificación: 29 de Febrero de 2016, 19:54:37 por KILLERJC »

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:rand no es totalmente aleatoria
« Respuesta #2 en: 09 de Marzo de 2016, 08:42:39 »
No esto todabia es peor.
Lo acabo de probar y ahora el resultado siempre es identico co las 2 primeras mal y siempre lo mismo
237-229-63-121-171..... ya ni siquiera cambia ni reseteando el micro. E utilizado de semilla

srand(200)

Cuando ley sobre este tema creo que srand recoge el numero del reloj esto es justo lo que no me interesa, a menos que el resultado cambie si pulsas un boton a los 5 sg y en otr a los 8 sg nada mas empezar el proyecto.

Que implica "static". Lo e quitado mas por intuicion no por saber lo que significa (statico me suena a anti-aleatorio). Tambien e sustituido char por int1, esto no varia nada. Todos los resultados vuelven a ser los mismos empieze como empieze.

Desconectado SavageChicken

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 931
Re:rand no es totalmente aleatoria
« Respuesta #3 en: 09 de Marzo de 2016, 10:28:17 »
Una forma de tomar un valor aleatorio para iniciar una semilla randómica, es configurar una de las patitas del PIC que tenga un conversor Análogo/Digital y dejarla al aire. Luego leer esa entrada y utilizar el valor leido, convertirlo a algún entero convenientemente adecuado y usarlo como semilla para randomizar.

Obviamente será posible solo si el PIC a utilizar tiene entrada A/D.

Salud 8)
No hay preguntas tontas...
Solo hay tontos que no preguntan.

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:rand no es totalmente aleatoria
« Respuesta #4 en: 09 de Marzo de 2016, 13:57:01 »
Gracias colaborador pero...

Citar
Análogo/Digital y dejarla al aire. Luego leer esa entrada y utilizar el valor leido

Confusión!! o uno u otro, pero cual y como, la matemática cuántica se me da peor que la convencional. Y luego esta si la dejo al aire libre, ¿que clase de valor voy a recoger? Mentalmente siempre me da nada.

Podrias ponerme un ejemplo visual a nivel de aficionado  :oops:

Desconectado luismh

  • PIC16
  • ***
  • Mensajes: 149
Re:rand no es totalmente aleatoria
« Respuesta #5 en: 09 de Marzo de 2016, 14:23:07 »
Que pic estás usando? Fijate si tiene conversor analógico/digital... Si es así, hacé lo que dice SavageChicken.
La idea de estar al aire es que el conversor tome datos del ruido presente en el ambiente. El valor de este ruido es totalmente aleatorio. Este método funciona bastante bien.
Saludos!

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re:rand no es totalmente aleatoria
« Respuesta #6 en: 09 de Marzo de 2016, 14:24:03 »
Si dejas una entrada analógica al aire (o le conectas un simple cablecillo) lo que vas a recoger es un valor de 'ruido' que, tal como te dice SavageChicken, podrías usar como semilla.


Desconectado SavageChicken

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 931
Re:rand no es totalmente aleatoria
« Respuesta #7 en: 09 de Marzo de 2016, 15:50:33 »
Creo que nuestro amigo se confunde con la frase "Analogo/Digital" y por eso dice "o uno u otro".
Pero se olvida que la frase completa es "Conversor Análogo/Digital".

Berto, para hacerlo sencillo, un conversor análogo digital convierte un valor analógico en un valor digital.

Para explicarlo, si tuviermos una entrada análoga que varía entre 0V y 5V, podríamos hacer una escala digital que convierta estos valores a, por ejemplo, un número que valla de 0 a 65535, entonces 0 equivale 0V, 65535 equivale a 5V y 32767 equivaldría a 2,5V

Dejando esa entrada al aire, actúa mo una especie de antena, leyendo el ruido ambiente como un voltaje en la entrada (normalmente dejar una pata al aire en un circuito digital puede traer problemas, ya que al captar el ruido ambiente podría provocar un mal funcionamiento del circuito, en este caso vamos a ocupar este problema a nuestro favor) el valor leído, en un istante será diferente al leido en otro momento y por tanto el conversor análogo digital te entregará valores distintos en cada momento que lo leas.
Usando este número como semilla para el randomize provocará que tengas un número más aletorio, que es lo que buscas finalmente.

Espero haberte aclarado el tema... salud 8)
« Última modificación: 09 de Marzo de 2016, 23:23:09 por SavageChicken »
No hay preguntas tontas...
Solo hay tontos que no preguntan.

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:rand no es totalmente aleatoria
« Respuesta #8 en: 09 de Marzo de 2016, 17:02:15 »
El pic es un 18F452 el que debe generar el randon, que es lo que tiene que poner en su patilla para que indique que se puede utilizar como conversor??

si este pin esta al aire actua de antena??
ruido=frecuencia??

prefiero lo del cablecito, y hacer primero la prueba con un potencimetro o algo a si

Desconectado SavageChicken

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 931
Re:rand no es totalmente aleatoria
« Respuesta #9 en: 09 de Marzo de 2016, 18:05:29 »
Para responder a tus dudas:
el Pic 18F452 tiene entradas analógicas.
No tienes que poner nada en su patilla, en el programa que estas implementado debes indicar que quieres utilizar una determinada entrada como análoga y activar el conversor análogo digital y como parte de tu programa debes leer en una variable el valor que hay en el mencionado conversor (yo no utilizo C para programar, quizá algún otro forero te pueda ayudar en eso, pero bien puedes hacerlo tu mismo si tienes interes por aprender y buscas información).
Si ese pin está al aire no queda referenciado a ningun voltaje específico, en cierta forma actua de antena y el voltaje en su patilla de entrada dependerá de millones de factores externos llamado ruido electromagnético.
ruido = frecuencia .... No
ruido = voltaje variable... Si

Lo del cablecito que indica xocas, es lo mismo, lo que él trata de decirte es que le sueldes un cablecito a la patita del PIC que está al áire, este cable hará de antena e intensificará más aún el ruido que entra al PIC.

Si colocas un potenciómetro y lo referencias a masa o a VCC dejará de ser randómico y simpre leeras el mismo valor.... justo lo opuesto a lo que buscas...

Salud 8)

P/D: nadie aquí te va a hacer tu programa, empieza a investigar y aprender, en este foro y otras páginas hay mucha información que te pueden ayudar... suerte.
No hay preguntas tontas...
Solo hay tontos que no preguntan.

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Re:rand no es totalmente aleatoria
« Respuesta #10 en: 09 de Marzo de 2016, 21:09:59 »
El potencimetro es inicial variar voltaje manualmente para cercionarme de haber hecho bien lo que no se de que va  -utilizar una determinada entrada como análoga y activar el conversor análogo digital y como parte de tu programa debes leer en una variable- yo solo e utilizado el -input_xx- 1 o 0 Lo que decis parece que tengo que buscarlo

Desconectado SavageChicken

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 931
Re:rand no es totalmente aleatoria
« Respuesta #11 en: 09 de Marzo de 2016, 23:21:12 »
lo que no se de que va  -utilizar una determinada entrada como análoga y activar el conversor análogo digital y como parte de tu programa debes leer en una variable- yo solo e utilizado el -input_xx- 1 o 0 Lo que decis parece que tengo que buscarlo

Efectivamente... Si estás usando C busca algunos tutoriales (y hay muchos) que explique el uso de entradas análogas y conversor análogo digital para pic.
Suerte.
« Última modificación: 09 de Marzo de 2016, 23:25:41 por SavageChicken »
No hay preguntas tontas...
Solo hay tontos que no preguntan.