Derniers sujets
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
Statistiques
Nous avons 209 membres enregistrésL'utilisateur enregistré le plus récent est HervOric
Nos membres ont posté un total de 8642 messages dans 754 sujets
fonction random() et rand()
Forum Oric :: Forums :: Forum Public :: Programmation en C
Page 1 sur 1
fonction random() et rand()
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 ...
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 ?
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 ...

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- Messages : 199
Date d'inscription : 02/05/2014
Age : 49
Localisation : Massy
Re: fonction random() et rand()
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:
EDIT: I posted the problem here OSDK bugs.
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- Messages : 112
Date d'inscription : 30/10/2014
Re: fonction random() et rand()
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:
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)
- 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
Re: fonction random() et rand()
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 :
another one, as we know that after a & with 11111, x can't be >31 :
And to initialize the random series, I use this code :
- 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();}
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);
_________________
>++++++++++[<++++++++>-]<.>++++++[<++++>-]<+.----.+++++++++++++..-------------.[-]
drpsy- Messages : 207
Date d'inscription : 20/07/2014
Age : 49
Localisation : Lagny sur Marne
Re: fonction random() et rand()
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- Messages : 199
Date d'inscription : 02/05/2014
Age : 49
Localisation : Massy
Re: fonction random() et rand()
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) :
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 :
si tu appelle la fonction comme ceci par exemple :
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)
Ladywasky- Messages : 240
Date d'inscription : 25/08/2018
Age : 50
Re: fonction random() et rand()
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 :ç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))
- Code:
i=rnd(5)
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- Messages : 199
Date d'inscription : 02/05/2014
Age : 49
Localisation : Massy
Re: fonction random() et rand()
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.
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- Messages : 240
Date d'inscription : 25/08/2018
Age : 50
Re: fonction random() et rand()
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;");
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- Messages : 199
Date d'inscription : 02/05/2014
Age : 49
Localisation : Massy

» [En cours] Exécuter un script php par webcron aléatoirement toutes les demi-heures
» Liste V6 750 pts vs random
» Test à faire chez vous! [Pas DE DANGER]
» [Synergie] Captain + Yugo + allié confrérie random
» Vos troll game
» Liste V6 750 pts vs random
» Test à faire chez vous! [Pas DE DANGER]
» [Synergie] Captain + Yugo + allié confrérie random
» Vos troll game
Forum Oric :: Forums :: Forum Public :: Programmation en C
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|
» ORIC ATMOS sur LE BON COIN
» Adaptation des jeux avec joystick IJK
» ORIC-1 sur LE BON COIN
» Combat Lynx
» arduitape
» Oricutron dans votre navigateur web ;)
» REGLAGE DU SON DE L'ORIC
» OricSpin : Télécharger et jouer
» Lire une cassette directement ?
» OricHir
» OricMouse - Un adaptateur souris/clavier
» J'ai fais un BSOD, mais sur Oric
» Atmos : certaines touches inactives
» Euphoric sur tablette Android