Forum Oric
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Derniers sujets
» besoin cable coleur et interface de lecture sd card
fonction random() et rand() EmptyJeu 6 Aoû 2020 - 18:55 par kenneth

» le forum fourre tout
fonction random() et rand() EmptyMar 30 Juin 2020 - 13:11 par Admin

» I had a dream .. glOric
fonction random() et rand() EmptySam 6 Juin 2020 - 14:18 par jbperin

» Multi soluces...
fonction random() et rand() EmptyMar 19 Mai 2020 - 12:41 par soft-bug

» Des nouvelles de BAS_ORIC
fonction random() et rand() EmptyMer 6 Mai 2020 - 16:08 par goyo

» 3D walkthrough template en moins de 600 lignes de C
fonction random() et rand() EmptyMer 29 Avr 2020 - 20:43 par Star42

» CB2 micro
fonction random() et rand() EmptySam 11 Avr 2020 - 19:29 par jbperin

» Le bonjour de codeur
fonction random() et rand() EmptyMer 1 Avr 2020 - 15:18 par Invité

» [résolu] Format des fichiers Hyperbasic...
fonction random() et rand() EmptySam 28 Mar 2020 - 19:50 par damien

» [résolu] Récupération contenu disquettes 3 pouces...
fonction random() et rand() EmptyVen 27 Mar 2020 - 15:06 par damien

» Echange de jeux/logiciels
fonction random() et rand() EmptyLun 23 Mar 2020 - 20:15 par Star42

» Ordi Portable Sony VAIO
fonction random() et rand() EmptyDim 22 Mar 2020 - 16:17 par froggy

» une atan2 pour vos lib math
fonction random() et rand() EmptyDim 22 Mar 2020 - 11:30 par drpsy

» nouveau site
fonction random() et rand() EmptyJeu 19 Mar 2020 - 20:02 par Star42

» CEO Mag Spéciaux disponibles
fonction random() et rand() EmptyJeu 19 Mar 2020 - 9:33 par musepat

Qui est en ligne ?
Il y a en tout 2 utilisateurs en ligne :: 0 Enregistré, 0 Invisible et 2 Invités

Aucun

Le record du nombre d'utilisateurs en ligne est de 29 le Mer 25 Fév 2015 - 14:01
Connexion

Récupérer mon mot de passe

Statistiques
Nous avons 209 membres enregistrés
L'utilisateur enregistré le plus récent est HervOric

Nos membres ont posté un total de 8577 messages dans 746 sujets
Portail ORIC



-55%
Le deal à ne pas rater :
Prix cassé sur les baskets Nike LeBron Witness III
45.35 € 99.99 €
Voir le deal

fonction random() et rand()

Aller en bas

fonction random() et rand() Empty fonction random() et rand()

Message par goyo le Mar 1 Jan 2019 - 14:07

j'aurais besoin d'aide sur les fonctions random() et rand() :

Je souhaite afficher des x et y aléatoirement à des positions de 0 à 20
mais je ne comprends pas pourquoi il m'affiche ces x et y aussi à des positions en dehors de 20 ...  pale

Est-ce la bonne écriture pour avoir des nombres de 0 à 20 ?

quelqu'un aurait il un exemple d'utilisation du random en C pour par exemple générer un nombre de 0 à 9 ?

Code:
#include <lib.h>

void main()
{
 
 int i,x,y;

 cls();
 for (i=0;i<200;i++)
 {
 rand();
 x=(random()/(1600));  // = 32767/1600 = 20
 rand();
 y=(random()/(1600));        

 gotoxy(x,y);printf("X");  
 }
}
goyo
goyo

Messages : 189
Date d'inscription : 02/05/2014
Age : 49
Localisation : Massy

Revenir en haut Aller en bas

fonction random() et rand() Empty Re: fonction random() et rand()

Message par iss le Mar 1 Jan 2019 - 16:29

There is BIG problem with rand/random functions in OSDK.
I'll post the issue with more information at the DF forum.
Quick solution for you is to use *exactly* this code:
Code:
#include <lib.h>

void main()
{
 
 int i,x,y;

 cls();
 for (i=0;i<200;i++)
 {
    x=(rand()/(1600));  // = 32767/1600 = 20
    y=(rand()/(1600));        
    gotoxy(x,y);
    printf("X");
 }
}

EDIT: I posted the problem here OSDK bugs.
iss
iss

Messages : 112
Date d'inscription : 30/10/2014

Revenir en haut Aller en bas

fonction random() et rand() Empty Re: fonction random() et rand()

Message par retroric le Mar 1 Jan 2019 - 17:24

I was having a quick look ar "rand.s" in OSDK and was really puzzled by the code: quite strangely, _rand and _random are the same, and the code calls some address right in the middle of the 'RND' BASIC routine in ROM:

Code:

_rand
_random
        ldx #$ff
        jsr $E355
        ldx $D2
        lda $D1
        rts

This looks suspicious as the RND function in ROM has the following (different) addresses for Oric1 / Atmos:

E34B / E34F

(source: "L'Oric A Nu" book, p. 248)


Dernière édition par laurentd75 le Mar 1 Jan 2019 - 19:52, édité 1 fois
retroric
retroric

Messages : 592
Date d'inscription : 09/08/2014
Age : 49
Localisation : Paris

https://github.com/retroric

Revenir en haut Aller en bas

fonction random() et rand() Empty Re: fonction random() et rand()

Message par drpsy le Mar 1 Jan 2019 - 17:52

Another solution :
- random returns a number between 0 and 32767
- compute a & with $1F (equals to 1 1111 in binary).
- number from 0 to 20 are from 0 to 10100 in binary.
- add a test to ignore numbers > 20 :
Code:

 x=0x1F&random();
 while(x>20){x=0x1F&random();}
it's quite efficient and avoids a division which is always disastrous in terms of performance

another one, as we know that after a & with 11111, x can't be >31 :
Code:

 x=0x1F&random();
 if(x>20){
   x=x-20;
 }

And to initialize the random series, I use this code :
Code:

   get();
   ticks = deek(0x276);
   srandom(ticks);
the call to a get() permits to have an unpredictable number as the germinal of the random function. (which is set by srandom).

_________________
>++++++++++[<++++++++>-]<.>++++++[<++++>-]<+.----.+++++++++++++..-------------.[-]
drpsy
drpsy

Messages : 206
Date d'inscription : 20/07/2014
Age : 48
Localisation : Lagny sur Marne

Revenir en haut Aller en bas

fonction random() et rand() Empty Re: fonction random() et rand()

Message par goyo le Mer 2 Jan 2019 - 9:47

It's work fine like this, thank you iss!!

iss a écrit:There is BIG problem with rand/random functions in OSDK.
I'll post the issue with more information at the DF forum.
Quick solution for you is to use *exactly* this code:
Code:
#include <lib.h>

void main()
{
 
 int i,x,y;

 cls();
 for (i=0;i<200;i++)
 {
    x=(rand()/(1600));  // = 32767/1600 = 20
    y=(rand()/(1600));        
    gotoxy(x,y);
    printf("X");
 }
}

EDIT: I posted the problem here OSDK bugs.
goyo
goyo

Messages : 189
Date d'inscription : 02/05/2014
Age : 49
Localisation : Massy

Revenir en haut Aller en bas

fonction random() et rand() Empty Re: fonction random() et rand()

Message par Ladywasky le Mer 2 Jan 2019 - 23:56

Oui, j'ai été confrontée au même problème dans l'OSDK quand j'ai développé Oric Kong en C mais il me semble (pas sur ) que cela a été corrigé dans la dernière version de l'OSDK.

En tout cas j'en parle sur mon github ( https://github.com/DJChloe/Orickong_C) :
moi-même ! a écrit:OSDK fixes :
Once the OSDK downloaded, and properly installed and configured, at this time two small fixes must be applied to OSDK v1.12 :

macro.h, in \macro directory : EQ0W_C code generator macro is missing, and must be added. (see this topic on the defence-force.org forum)
lib.h, in \include directory : the rand function declared at the far end of the file is broken, and this line must be commented.
The two fixed files are in the ./Fixes for OSDK directory of the project.

une fois la dernière ligne de lib.h commentée (ou supprimée) tu te retrouveras avec la bonne version du rand fonctionnant (mais casse pied à utiliser) du coup, je m'en suis sortie en déclarant ma fonction rnd façon "Oric" dans mon code :
Code:

char rnd(char max);

char rnd(char max)
 {
 return (char) (rand()/(32768/max));
 }

si tu appelle la fonction comme ceci par exemple :
Code:
i=rnd(5)
ça te retournera un entier entre 0 et 4. (Attentio : rnd(0) est un non sens et ça fera planter ton programme (division par 0))
Ladywasky
Ladywasky

Messages : 240
Date d'inscription : 25/08/2018
Age : 50

Revenir en haut Aller en bas

fonction random() et rand() Empty Re: fonction random() et rand()

Message par goyo le Jeu 3 Jan 2019 - 9:16

Ladywasky a écrit:Oui, j'ai été confrontée au même problème dans l'OSDK quand j'ai développé Oric Kong en C mais il me semble (pas sur ) que cela a été corrigé dans la dernière version de l'OSDK.

En tout cas j'en parle sur mon github ( https://github.com/DJChloe/Orickong_C) :
moi-même ! a écrit:OSDK fixes :
Once the OSDK downloaded, and properly installed and configured, at this time two small fixes must be applied to OSDK v1.12 :

macro.h, in \macro directory : EQ0W_C code generator macro is missing, and must be added. (see this topic on the defence-force.org forum)
lib.h, in \include directory : the rand function declared at the far end of the file is broken, and this line must be commented.
The two fixed files are in the ./Fixes for OSDK directory of the project.

une fois la dernière ligne de lib.h commentée (ou supprimée) tu te retrouveras avec la bonne version du rand fonctionnant (mais casse pied à utiliser) du coup, je m'en suis sortie en déclarant ma fonction rnd façon "Oric" dans mon code :
Code:

char rnd(char max);

char rnd(char max)
 {
 return (char) (rand()/(32768/max));
 }

si tu appelle la fonction comme ceci par exemple :
Code:
i=rnd(5)
ça te retournera un entier entre 0 et 4.  (Attentio : rnd(0) est un non sens et ça fera planter ton programme (division par 0))


je ne comprends pas j’obtiens systématiquement zéro à l'appel de ta fonction rnd(char max). Mais si je mets par exemple 5 en dur à la place de max, ça marche !?
Code:
return (rand()/(32768/max)); // fonctionne pas, renvoie 0
Code:
return (rand()/(32768/5)); // fonctionne
goyo
goyo

Messages : 189
Date d'inscription : 02/05/2014
Age : 49
Localisation : Massy

Revenir en haut Aller en bas

fonction random() et rand() Empty Re: fonction random() et rand()

Message par Ladywasky le Jeu 3 Jan 2019 - 21:07

Nom mais les lignes que je t'ai donné, c'est pour déclarer (créer, fabriquer si tu préfère dans ton programme en C.

après, la commande s'utilise en remplaçant "char max" (max, c'est une variable de fonction qui est comprise entre 1 et 255) par le nombre que tu veux entre 1 et 255. Si tu mets 10 ( rnd(10) , ça va te donner un nombre entre 0 et 10, si tu mets 25 ( rnd(25) ), ça générera un nombre entre 0 et 25). C'est e même principe que DEF FN() en BASIC (voir le manuel de l'Atmos.

Ladywasky
Ladywasky

Messages : 240
Date d'inscription : 25/08/2018
Age : 50

Revenir en haut Aller en bas

fonction random() et rand() Empty Re: fonction random() et rand()

Message par goyo le Jeu 28 Fév 2019 - 18:35

Ladywasky a écrit:Nom mais les lignes que je t'ai donné, c'est pour déclarer (créer, fabriquer si tu préfère dans ton programme en C.

après, la commande s'utilise en remplaçant "char max" (max, c'est une variable de fonction qui est comprise entre 1 et 255) par le nombre que tu veux entre 1 et 255. Si tu mets 10 ( rnd(10) , ça va te donner un nombre entre 0 et 10, si tu mets 25  ( rnd(25) ), ça générera un nombre entre 0 et 25). C'est e même principe que DEF FN() en BASIC (voir le manuel de l'Atmos.


Merci Lady
ça fonctionne bien mais c'est super lent le rnd du osdk. Y aurait-il un moyen d'avoir une routine plus rapide ?

j'ai trouvé ça qui est un peu plus rapide que l'appel au rnd de l'osdk dans une boucle :

Code:
unsigned char b;

asm(" ldx #$12;"
 "jsr $E355;"
 "ldx $D2;"
 "lda $D1;"
 "stx %b;");
sans trop comprendre ce que ça fait, je récupère un random de 0 à 255 dans la variable b....

voici mon test ou l'instruction asm fait gagner un peu plus de temps:
Code:

char x,y,i;
unsigned char b;
void main()
{
   
   unsigned adr=0xA000;
   b=65;
   hires();
   for (i=0;i<(8000-(3*40));i++)
   {
      
         b=(rand()/(32768/255));
         /*
         asm(" ldx #$12;"
            "jsr $E355;"
            "ldx $D2;"
            "lda $D1;"
            "stx %b;");
         */
       
         //if (b==26) poke(adr++,b);
         
         if ((b>0)&&(b<128))
         {
            if ((b>7)&&(b<16))
            {
            }
            else   
            {
               if ((b<24)||(b>31))
               {
                  
                     poke(adr++,b);
                  
               }
            }
         }
   }   
   
      
}
goyo
goyo

Messages : 189
Date d'inscription : 02/05/2014
Age : 49
Localisation : Massy

Revenir en haut Aller en bas

fonction random() et rand() Empty Re: fonction random() et rand()

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum