comando RANDOM en PBASIC

1

Estoy intentando usar el comando random en PBASIC y no estoy seguro de cómo funciona. Estoy usando un PICAXE-08 Proto Board Kit, y el chip específicamente es un PICAXE-08M2.

Aquí está el código que estoy usando:

symbol randnum = w0
RANDOM randnum
randnum = randnum // 2

FOR action = 1 TO 5
    IF randnum > 0 THEN
        LOW led_red
        PAUSE 500
        HIGH led_red
        PAUSE 500
    ELSE
        SOUND buzzer,(100, 100)
        PAUSE 500
    ENDIF
NEXT action

(Quizás debido a errores de montaje, el LED ALTO corresponde a BAJO y viceversa).

En primer lugar, esperaba poner el comando RANDOM randnum dentro del bucle for, pero si lo hago, el recuento del bucle se vuelve incorrecto. En lugar de 5 acciones, solo obtengo 2.

El segundo problema es que espero que randnum sea 0 o 1, de modo que el 50% del tiempo que el LED esté encendido y el 50% del tiempo suene el zumbador. Sin embargo, el LED se enciende el 100% del tiempo, incluso en varias pruebas. Obviamente, randnum nunca es 0. Sin embargo, según la documentación , RANDOM debería dar el Variable un valor entre 0 y 65535, inclusive.

¿Cuál es el problema aquí?

    
pregunta Tianxiang Xiong

2 respuestas

3

El comando RANDOM no simplemente genera un número aleatorio para ti; lo que realmente está haciendo es tomar cualquier valor que ya esté en la variable y transformarlo de forma pseudoaleatoria. En otras palabras, la variable que le das es el estado interno del generador de números aleatorios. No debe modificar esa variable de ninguna otra manera si desea que los números generados sean lo más aleatorios posibles.

Cuando establece randnum = randnum // 2, lo obliga a ser 0 o 1. Parece que cuando el comando RANDOM ve un valor de 1, genera un nuevo número que es impar, por lo que una vez otra vez establecer randnum a 1.

Lo que debes hacer es usar una segunda variable para contener el resultado binario:

RANDOM randnum
randbit = randnum // 2

(No puedo explicar el problema con el cambio en el recuento de bucles; eso parece ser un problema aparte).

    
respondido por el Dave Tweed
0
symbol randnum = w0  

FOR action = 1 TO 5
    random randnum
    let randv=randnum & 1  ; Chances of odd and even are equal
    IF randv > 0 THEN
        LOW led_red
        PAUSE 500
        HIGH led_red
        PAUSE 500
    ELSE
        SOUND buzzer,(100, 100)
        PAUSE 500
    ENDIF
NEXT action
    
respondido por el perilbrain

Lea otras preguntas en las etiquetas