Commande RANDOM dans PBASIC

Tianxiang Xiong

Commande RANDOM dans PBASIC


J’essaie d’utiliser la randomcommande dans PBASIC et je ne sais pas comment cela fonctionne. J’utilise un kit de carte PICAXE-08 Proto, et la puce est spécifiquement un PICAXE-08M2.

Voici le code que j’utilise:

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

(Peut-être en raison d’erreurs de montage, la LED HIGH correspond à LOW et vice-versa).

Tout d’abord, je m’attendais à mettre la RANDOM randnumcommande dans la boucle for, mais si je le fais, le nombre de boucles devient incorrect. Au lieu de 5 actions, je n’en reçois que 2.

Le deuxième problème est que je m’attends randnumà être égal à 0 ou 1, de sorte que 50% du temps, la LED est allumée et 50% du temps, le buzzer retentit. Cependant, la LED s’allume 100% du temps, même lors de plusieurs essais. Évidemment, randnumn’est jamais 0. Cependant, selon la documentation , RANDOMdevrait donner à la variable une valeur entre 0 et 65535 inclus.

Quel est le problème ici?

Réponses


 Dave Tweed

La commande RANDOM ne génère pas simplement un nombre aléatoire pour vous; ce qu’il fait en fait, c’est de prendre la valeur qui se trouve déjà dans la variable et de la transformer de manière pseudo-aléatoire. En d’autres termes, la variable que vous lui donnez est l’état interne du générateur de nombres aléatoires. Vous ne devez pas modifier cette variable d’une autre manière si vous souhaitez que les nombres générés soient aussi aléatoires que possible.

Lorsque vous définissez randnum = randnum // 2, vous le forcez à être 0 ou 1. Il semblerait que lorsque la commande RANDOM voit une valeur de 1, elle génère un nouveau nombre impair, donc vous définissez à nouveau randnum au 1.

Ce que vous devez faire est d’utiliser une deuxième variable pour contenir le résultat binaire:

RANDOM randnum
randbit = randnum // 2

(Je ne peux pas expliquer le problème avec le changement de nombre de boucles; cela semble être un problème distinct.)

Tianxiang Xiong

J’ai trouvé le problème avec le nombre de boucles changeant. Apparemment, la mémoire w0n’existe pas pour le 08M2. Je l’ai changé b1et ça fonctionne. Cependant, même si j’ai appliqué les modifications avec randbit, je ne reçois toujours pas 50 à 50 occurrences. Existe-t-il une meilleure documentation sur le RANDOMfonctionnement que sur le site Web de PICAXE?


 péril cerveau

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

 

commande, dans, PBASIC, RANDOM

 

google

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *