Autor Tema: Generador de numeros aleatorios para quiniela  (Leído 7703 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Generador de numeros aleatorios para quiniela
« en: 06 de Abril de 2012, 19:57:48 »
Hola mi idea es generar numeros aleatorios entre 0 y 9 para formar numeros de 3 cifras para la quiniela, todo en asembler porque no se programar en C. Pienso utilizar el valor de TMR0 y formar diez grupos de numeros y segun en que grupo caiga el valor del timer al pulsar la tecla, determinar el numero a mostrar, pero no se como hacer para saber cuando un numero pertenece a un grupo. Ayuda

Desconectado AcoranTf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1093
Re: Generador de numeros aleatorios para quiniela
« Respuesta #1 en: 06 de Abril de 2012, 22:49:28 »
Hola soymoe, hay un integrado que es un triple contador, se utilizaba hace años en las tragaperras como generador de numeros aleatorios para sacar las combinaciones. Te dejo la hoja tecnica por si te interesa aunque el formato es de 24 pines ancho, o sea ocupa bastante espacio en la PCB. Se trata del 8253, lo fabricaban Intel, AMD, NEC, etc.
A programarlo con un PIC no te puedo ayudar, ya que estoy empezando con ellos.

Saludos.

P.D.: No me deja poner el PDF porque pesa 640 K y el maximo es de 500 K. Pero lo puedes conseguir facilmente en internet.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Generador de numeros aleatorios para quiniela
« Respuesta #2 en: 07 de Abril de 2012, 09:26:36 »
¿Entendemos por quiniela 1,X,2, la de futbol? ¿o es otro tipo de quiniela?.

Como el TMR0 genera 256 numeros, solo hay que saber si es menor que una cantidad sera un numero y asi sucesivamente.  Para 1X2 seria 85.33 lo dejariamos en 85, menor de 85 un 1, menor de 170 una X y de 170 a 255 un 2. Esto seria de manera lineal, pero se dan mas 1 que los otros dos, aqui habria que hacer calculos por probabilidad/estadistica.

Si es para 9 numeros cada 28.44 valores seria un numero, lo dejamos en 28, menor de 28 es 0, entre 28 y 56 es 1 y asi sucesivamente. Para saber sies menor o mayor que un numero se resta y se chequea el FLAG de CARRY, (creo que es este sino es este es el DC digit carry) bueno esto ya lo mirarias.

Bueno ya diras si es esto mas o menos esto lo que quieres o estoy metiendo la pata y no me entere  :x :x

Desconectado mtristan

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 395
Re: Generador de numeros aleatorios para quiniela
« Respuesta #3 en: 07 de Abril de 2012, 11:48:39 »
.


Podrías usar el timer 1, y precargarlo con (2^16)-1000, de manera que solo pueda tomar 1000 valores distintos entre desbordes (0 a 999). Si estás buscando un generador de números de una sola cifra, sería bastante más sencillo usar un 555 conectado a un contador de décadas y un conversor a 7 segmentos.

Saludos.

When you see a good move, look for a better one (Emanuel Lasker)

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re: Generador de numeros aleatorios para quiniela
« Respuesta #4 en: 07 de Abril de 2012, 18:34:08 »
.


Podrías usar el timer 1, y precargarlo con (2^16)-1000, de manera que solo pueda tomar 1000 valores distintos entre desbordes (0 a 999). Si estás buscando un generador de números de una sola cifra, sería bastante más sencillo usar un 555 conectado a un contador de décadas y un conversor a 7 segmentos.

Saludos.


lo que yo quiero es generar numeros de 3 cifras al pulsar un boton, la opcion del timer me interesa pero no la entiendo.

Desconectado mtristan

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 395
Re: Generador de numeros aleatorios para quiniela
« Respuesta #5 en: 07 de Abril de 2012, 18:52:32 »
.


Sí, creo que no fui muy claro :mrgreen:. Yo digo lo siguiente: si usás el timer 0 no te alcanzan las combinaciones de 8 bits para generar 1000 números distintos. Por eso propongo usar el timer 1 (o algún otro de 16 bits), pero ahora resulta que te sobran las combinaciones posibles, que son 2^16=65536. Luego, para que el número de combinaciones sea exactamente 1000, te sugiero precargar el timer con el valor 64537 (=65536-999) luego de cada desborde, de modo que los registros que llevan la cuenta solamente puedan variar entre 64537 y 65536, es decir, que solo puedan adoptar 1000 valores distintos. Finalmente, para obtener números entre 0 y 999 habría que restar a la cuenta del timer la cantidad 64537. Por ejemplo, si la cuenta va por 64799, el resultado es 262.
Espero que esta vez se entienda mejor.

Saludos.

« Última modificación: 07 de Abril de 2012, 18:56:14 por mtristan »
When you see a good move, look for a better one (Emanuel Lasker)

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Generador de numeros aleatorios para quiniela
« Respuesta #6 en: 07 de Abril de 2012, 21:52:16 »
Si pudiera aplicar módulo, cualquier número bastaría...

0 a 65535 (módulo) 1000 siempre va a devolver un número entre 0 y 999.

Lo malo es que está en ASM  :(

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Generador de numeros aleatorios para quiniela
« Respuesta #7 en: 07 de Abril de 2012, 22:21:51 »
Osea, lo que quieres es que se generen numeros de 0 al 999 no? Necesitarias usar un timer de 16bits para mayor comodidad, con uno de 8bits podrias tambien pero te complicarias un poco mas.

ahora lo que tienes que hacer es cargar siempre en el TMRx 65535-999 osea 64535, tanto en el inicio, como en cada interrupcion.

Para obtener el numero seria Numeroaleatorio=(TMRx-64535);

Ahora si TMRx es por ejemplo 65300 tu numeroaleatorio seria 765.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Generador de numeros aleatorios para quiniela
« Respuesta #8 en: 08 de Abril de 2012, 01:15:57 »
También podrías utilizar un canal del conversor ADC y dejarlo al aire. Por lo gral los PIC tienen conversores de 10bits o mayor, por lo que te alcanzaría para generar un número entero entre [0 y 999].


"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re: Generador de numeros aleatorios para quiniela
« Respuesta #9 en: 08 de Abril de 2012, 10:05:35 »
Osea, lo que quieres es que se generen numeros de 0 al 999 no? Necesitarias usar un timer de 16bits para mayor comodidad, con uno de 8bits podrias tambien pero te complicarias un poco mas.

ahora lo que tienes que hacer es cargar siempre en el TMRx 65535-999 osea 64535, tanto en el inicio, como en cada interrupcion.

Para obtener el numero seria Numeroaleatorio=(TMRx-64535);

Ahora si TMRx es por ejemplo 65300 tu numeroaleatorio seria 765.
Es una buena opcion. Por ahora lo resolvi haciendo un conteo permanente entre 0 y 999, que leo con la pulsacion de un boton en rb0 para determinar el numero sorteado, tengo que probarlo.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Generador de numeros aleatorios para quiniela
« Respuesta #10 en: 08 de Abril de 2012, 10:32:01 »
Normalmente se suele utilizar un generador de números pseudoaleatorios.
No son completamente aleatorios, de manera que se les suele meter como inicio una "semilla" con un número realmente aleatorio (tiempo de encendido, reloj de tiempo real, pulsación de una tecla, etc.)

Aquí tienes más: http://en.wikipedia.org/wiki/Linear_congruential_generator

un ejemplo de generador de números pseudoaleatorios:
N+1 = (N · 17364) modulo 65521

Muchos compiladores de C tienen generación de aleatorios y así te ahorras programarlo tú. Es más fácil aprender a copiar un ejemplo ya programado en c que aprender a hacer una rutina de números aleatorios en assembler.
Las funciones c son srand(semilla) para introducir un primer número realmente aleatorio y rand() que devuelve números aleatorios.
http://www.cplusplus.com/reference/clibrary/cstdlib/rand/

Saludos.
« Última modificación: 08 de Abril de 2012, 10:36:52 por Picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Generador de numeros aleatorios para quiniela
« Respuesta #11 en: 08 de Abril de 2012, 10:39:32 »
Mira lo que he encontrado en Microchip:
http://ww1.microchip.com/downloads/en/AppNotes/00544d.pdf
Página 5 explicación y al final, el código en assembler.


Saludos

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: Generador de numeros aleatorios para quiniela
« Respuesta #12 en: 08 de Abril de 2012, 13:07:14 »
aquí esta el código que hace referencia Picuino

Código: ASM
  1. ;*******************************************************************
  2. ;
  3. ; Random Number Generator
  4. ;
  5. ; This routine generates a 16 Bit Pseudo Sequence Random Generator
  6. ; It is based on Linear shift register feedback. The sequence
  7. ; is generated by (Q15 xorwf Q14 xorwf Q12 xorwf Q3 )
  8. ;
  9. ; The 16 bit random number is in location RandHi(high byte)
  10. ; & RandLo (low byte)
  11. ;
  12. ; Before calling this routine, make sure the initial values
  13. ; of RandHi & RandLo are NOT ZERO
  14. ; A good chiose of initial random number is 0x3045
  15. ;*******************************************************************
  16. ;
  17. Random16
  18.                 rlcf RandHi,W
  19.                 rlcf WREG, F ; carry bit = xorwf(Q15,14)
  20.  ;
  21.                 swapf RandHi, F
  22.                 swapf RandLo,W
  23.                 rlncf WREG, F
  24.                  xorwf RandHi,W ; LSB = xorwf(Q12,Q3)
  25.                 swapf RandHi, F
  26.                 andlw 0x01
  27.                 rlcf RandLo, F
  28.                 xorwf RandLo, F
  29.                 rlcf RandHi, F
  30.                 return
  31.  ;
  32.  PAGE
  33.  ;*******************************************************************
  34.  ; Gaussian Noise Generator
  35.  ;
  36.  ; This routine generates a 16 Bit Gaussian distributed random
  37.  ; points. This routine calls the routine “Random16”, which
  38.  ; generates a psuedo random noise sequence. Gaussian noise
  39.  ; is computed using the CENTRAL LIMIT THEOREM.
  40.  ; The Central Limit Theorem states that the average weighted
  41.  ; sum of uncorelated samples tends to have a Gaussian distribution
  42.  ; For practical purposes, the sum could be over a sample size
  43.  ; of 32 Random numbers. Better results could result if a larger
  44.  ; sample size is desired. For faster results, a sum over 16 samples
  45.  ; would also be adequate ( say, for applications like Speech synthesis,
  46.  ; channel simulations, etc).
  47.  ;
  48.  ; The 16 bit Gaussian distributed point is in locations
  49.  ; GaussHi & GaussLo
  50.  ;
  51.  ; Before calling this routine, the initial seed of Random
  52.  ; number should be NON ZERO ( refer to notes on “Random16” routine
  53.  ;
  54.  ;*******************************************************************
  55.  ;
  56.  Gauss
  57.                 clrf count, F
  58.                 bsf count,5 ; set Sample size = 32
  59.                 clrf GaussLo, F
  60.                 clrf GaussHi, F
  61.                 clrf GaussTmp, F
  62.  ;
  63. NextGauss
  64.                 call Random16 ; get a random value
  65.                 movfp RandLo,WREG
  66.                 addwf GaussLo, F
  67.                 addwfc GaussHi, F
  68.                 clrf WREG, F
  69.                 addwfc GaussTmp, F
  70.                 decfsz count, F
  71.                 goto NextGauss ; sum 16 random numbers
  72.  ;
  73.                 movlw 5
  74. GaussDiv16
  75.                 rrcf GaussTmp, F
  76.                 rrcf GaussHi, F
  77.                 rrcf GaussLo, F ; weghted average
  78.                 decfsz WREG, F ; divide by 32
  79.                 goto GaussDiv16
  80.  ;
  81.                 return
  82.  ;
  83.  
  84.                 END ; End Of arith.asm
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado mtristan

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 395
Re: Generador de numeros aleatorios para quiniela
« Respuesta #13 en: 08 de Abril de 2012, 13:34:01 »
.


Citar
Por ahora lo resolvi haciendo un conteo permanente entre 0 y 999, que leo con la pulsacion de un boton en rb0 para determinar el numero sorteado

Mucho más sencillo que lo que yo decía :mrgreen:

When you see a good move, look for a better one (Emanuel Lasker)

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re: Generador de numeros aleatorios para quiniela
« Respuesta #14 en: 09 de Abril de 2012, 20:28:20 »
Como dije por ahora lo resolvi haciendo un conteo de 0 a 1000, que interrumpo con la interrupcion RB0, para leer el valor binario obtenido(binL, binH), que convierto para obtener un BCD (bcdL,bcdM,bcdH) de donde saco las ultimas 3 cifras para generar el numero aleatorio. Tiene un efecto visual "llamador" y la rutina de sorteo "sorteador" y la de mostrar en display "display"El caso es que en proteus no me funciona, porque no aparecen los numeros. Aqui les dejo la simulacion.