TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: LordLafebre en 09 de Junio de 2005, 13:30:00
-
Hola Amigos:
Una ayudita con esto por favor:
Tengo un vector de 10 posiciones y quiero seleccionar de forma aleatoria una posición de dicho vector utilizando la función RANDOM…
La ayuda dice:
RANDOM Var
Efectúa una iteración pseudo-aleatoria en Var .Var debe ser una variable de 16 bit .No se pueden usar variables de array con índice variable, pero se permite usar variables de array con índice constante. Var se usa tanto como origen, como para guardar el resultado .El algoritmo pseudo-aleatorio usado tiene un paso de 65535 (el único número que no produce es el cero).
RANDOM W4 coloca un número aleatorio en W4.
Lo que no tengo idea y quiero saber es como hace para que sea solo valores entre 1 y 9, alguien puede guiarme con esto…? 
-
Hola

Primero genera el random , luego tomas el resto de la division var/10, y asi tienes un random que tomara un valor de 0 a 9. Suerte
-
Hola:
Gracias ejcm... a mi parecer hice lo que tu me dijiste con este codigo:
num var word
pause 250
lcdout $FE,1
inicio:
random num
num=num/10
lcdout $FE,$C5,dec num
pause 2000
lcdout $FE,1
goto inicio
end
Pero lo que obtengo son valores mayores a nueve... luego llega un momento que se hace 0 y permanece siempre asi... estoy haciendo algo mal..? por si de algo sirve utilizo un Pic 16F628.. pero no creo que influya en nada.... Que es lo que estoy haciendo mal...?
-
Hola Lord

Lo que te digo es asi:
num var word
pause 500
lcdout $FE,1
inicio: random num
num = num // 10 "ESTO DIVIDE A NUM POR 10 Y EL RESTO DE LA DIVICION LO GUARDA EN NUM
lcdout $FE,$C5,dec num
pause 2000
lcdout $FE,1
goto inicio
aSI TIENE QUE ANDAR
-
Hola ejmc:
probé lo que tu me dijistey si genera numeros pero solamente el 1 2 y 5 y siempre en la misma secuencia.. funciona siempre así o hay que corregir algo...?
-
Puedes hacer una cosa un poco más lenta pero que puede ser más eficaz:
Generas una var random de 1 a 65535 y con un case o un if seleccionas:
si var entre 1 y 7000 entonces el random es 1
si var entre 7001 y 14000 entonces random es 2
si var entre 14001 y 21000 entonces random es3
yt así sucesivamente. Se supone que todos los valores serán equiprobables y te irán saliendo todos los random
Saludos
Ricky
-
Hola Lord

Si el random esta bien hecho no tendria que suceder eso que dices. Asi que deve ser un problema del PBP. Capas que usando dos random y una operacion cualquiera entre ellos, puedes solucionarlo. Quiero decir algo asi:
random var1
random var2
var1 = var1 // 5 "VAR1 TENDRIA QUE TENER CUALQUIER VALOR ENTRE 0 Y 4
var2 = var2 // 6 "VAR2 " " " " " " 0 Y 5
var_final = var1 + var2 "var_final tendria que tener cualquier valor entre 0 y 9
Para saver si el random del pbp es el que esta mal puedes probar lo siguiente: gENERA un " RANDOM var ". Muestra el valor en el display y fijate si el ultimo digito de cada numero generado sigue la secuencia 1 2 y 5 que dices.
Suerte
-
Hola:
Retomando nuevamente esto, ahora que lo necesito, me parece raro y sigo teniendo problemas con este bendito RANDOM y no puedo generar valores aleatorios entre 1-9 :8}, alguien tiene experiencia con esto y puede darme una ayudita :P
Gracias :mrgreen:
-
el Pic16F628 si no recuerdo mal, tiene 3 Timer, usa uno para generar el random
es un poco bestia la solucion pero creo que debe ir bien.
-
Mi sugerencia es que utilices un pin ADC como entrada analógica al aire configurado, por ejemplo, a 8 bits de resolución.
El número que leerás será cualquier valor entre 0 y 255. Para conseguir un nº del 1 al 9, podrías hacer lo siguiente:
ValorRandom = entero ( ValorADC / 8 ) + 1
-
Mi sugerencia es que utilices un pin ADC como entrada analógica al aire configurado, por ejemplo, a 8 bits de resolución.
El número que leerás será cualquier valor entre 0 y 255. Para conseguir un nº del 1 al 9, podrías hacer lo siguiente:
ValorRandom = entero ( ValorADC / 8 ) + 1
Esa si es una buena idea usar el adc, Yo estuve probando con RANDOM de PBP y si genera varios numeros al azar pero cuando sobrepasa el rango si es byte los 255 vuelve a repetir los valores.
-
Hola:
Pues es muy buena la idea, gracias Manolo, la voy a probar, el Random funciona bien, pero genera un número aleatorio entre 0-65535, y a ratos da un mismo valor, probaré con lo que comentó manolo a ver que tal.
-
Hola!
Hola Lord<img src="http://pics.miarroba.com/caretos/smile.gif" alt="Sonrisa" title="Sonrisa" />
Si el random esta bien hecho no tendria que suceder eso que dices. Asi que deve ser un problema del PBP. Capas que usando dos random y una operacion cualquiera entre ellos, puedes solucionarlo. Quiero decir algo asi:
random var1
random var2
var1 = var1 // 5 "VAR1 TENDRIA QUE TENER CUALQUIER VALOR ENTRE 0 Y 4
var2 = var2 // 6 "VAR2 " " " " " " 0 Y 5
var_final = var1 + var2 "var_final tendria que tener cualquier valor entre 0 y 9
Para saver si el random del pbp es el que esta mal puedes probar lo siguiente: gENERA un " RANDOM var ". Muestra el valor en el display y fijate si el ultimo digito de cada numero generado sigue la secuencia 1 2 y 5 que dices.
Suerte
Hay algun tipo de error en este razonamiento. Los valores de 0 a 9 obtenidos no son "al azar".
Me explico: Las posibilidades de obtener un 0 son una en 5x6 = 30, ya que ambos resultados tienen que ser 0 a la vez, y hay una posibilidad en 5 que el primero lo sea, y una en 6 de que el segundo lo sea, luego, hay una en 30 de que salga un "0" al sumar.
Peeeeeero...para otros numeros no es asi. Por ejemplo, para que salga un 5, puede salir 0 y 5, 1 y 4, 2 y 3, 3 y 2 o 4 y 1. Por lo que hay 5 veces mas posibilidades de obtener un "5" que un cero...y eso es inaceptable en el azar.
De hecho, algo de eso puede aprenderse si se estudian los numeros que se obtienen al arrojar un par de dados....no de gusto cada numero se paga mas o menos, justamente debido a esto.
Saludos!
-
Yo haria:
RANDOM Var
Var = Var % 10
Donde "%" deberia ser el operador MOD(no programo en este lenguaje de PICs asi que por ahi le corresponde otro simbolo).
-
Si lo queres entre 1 y 9 seria:
RANDOM Var
Var = (Var % 9) + 1
-
Hola:
Ariel, Random genera números aleatorios entre 1-65535, el cero no, es así en PBP, voy a probar con sus sujerencias y ya les cuento amigos. GRACIAS :mrgreen:
-
Hola:
Pues probé como Bruno comenta y es algo así como lo hago en VB, pero en PBP no funciona, salen resultados repetidos y continuos, con la sujerencia de Manolo (muy acertada, gracias) va mucho mejor, así lo tengo probado por ahora y va bien, voy a hacer para dos dígitos y visualizar en un par de displays y ya les cuento.
Gracias a todos :-/
-
Me confundí al transcribir la fórmula; la correcta es:
ValorRandom = entero ( ValorADC / 32 ) + 1
-
Hola a todos !
RANDOM VAR1
VAR2 = DIG VAR1,3
PRINT @VAR2
Según Protón, con ése código, generas el número aleatorio y luego escojes el dígito del numero final obtenido en VAR1 que desees, para mostrarlo en el LCD.
O sea, si obtienes el número 12345, la sentencia DIG te pasará a VAR2 el número 4
Otro ..... 10729 .... VAR1 = 2
Combina esas dos instrucciones. RANDOM y DIG. Tal vez te sirva.
Saludos
Mario
-
Hola:
Gracias Mario, tambien es una buena opción, si miré el protón, y de hecho es lo mismo para PBP, voy a hacer un poco de pruebas y veré cuál es la mejor opción.
Gracias.