[Résolu] Génération de nombres aléatoires
Posté le 05/11/2013 21:02
Bonjour,
J'ai trouvé
sur le forum une fonction permettant de générer un nombre aléatoire entre deux réels :
float randFloat_a_b(float a, [purple]float[/purple] b)
{
static [purple]int[/purple] ini = [maroon]123456789[/maroon];
[purple]float[/purple] nb, val;
srand(ini);
val = (float)(rand()) / RAND_MAX);
nb = a*val+b;
ini = rand();
[b][blue]return[/blue][/b] nb;
}
Ce code est censé générer des nombres aléatoires dans des délais inférieurs à la 1/120e de seconde, car le RTC de la calculatrice subdivise chaque seconde en 120 sous-divisions, ou 180, enfin peu importe. Dans le jeu que je développe, il s'avère que la génération de deux nombres aléatoires consécutifs se font dans un délai inférieur à 1/120e de seconde, d'où la nécessité d'ajouter une sorte de grain de sel pour corriger le tir, cependant, ce code ne semble pas faire autre chose que de stocker le nombre aléatoire dans l'int ini. Quelqu'un pourrait donc me guider pour faire une fonction de génération aléatoire répondant aux critères cités précédemment ? Merci de votre aide
Citer : Posté le 05/11/2013 21:06 | #
cadeau
tu l’initialise au début et une seule fois avec -get_ticks(), et puis a chaque fois que tu l’appellera, elle te sortira un nombre différent entre 0 et max-1
{
static unsigned int seed = 0x12345678;
if(max<1)seed=-max;
seed = (0x41C64E6D * seed) + 0x3039;
if(max>0)return ((seed >> 16) % max);
}
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 05/11/2013 21:19 | #
Merci pour la fonction, j'ai bien initialisé srand() une seule fois, au début du main, mais par contre cette fonction ne retourne que des entiers, comment adapter cette fonction pour retourner des flottants ? Parce qu'il n'y a pas d'opérateur modulo pour les flottants si je ne me trompe pas. Ou alors faut il que je demande des nombres par exemple 10 fois plus grands pour que je divise ensuite par 10, si la fonction analogue n'est pas faisable ?
Système d'exploitations : Apricity OS - Windows 10
Citer : Posté le 05/11/2013 21:28 | #
la fonction que je t'ai donné n'utilise pas srand, tu doit faire au début de ton programme random(-get_ticks());
pour les flottant, il te suffit juste de diviser par le nombre que tu veux pour avoir un simili-flottant (mais c'est pour quel usage?)
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 05/11/2013 21:33 | #
Je fais un side-scroller, un vaisseau qui navigue dans l'espace et qui doit éviter les météorites et différents ennemis sur son passage (quelle originalité tiens), l'utilité de cette fonction est de donner une vélocité aléatoire aux météorites.
Système d'exploitations : Apricity OS - Windows 10
Citer : Posté le 05/11/2013 21:37 | #
dans ce cas la effectivement, utilise une virgule fixe
les nombres flottants sont très lent a utiliser, et ne doivent être utiliser que dans les cas extrêmes.
simplement, génère un nombre 100 fois plus grand que ce que tu voudrais comme vitesse, et quand tu additionne la vitesse et la position de la météorite, tu divise par 100
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 05/11/2013 21:42 | #
D'accord, merci du conseil alors
Système d'exploitations : Apricity OS - Windows 10
Citer : Posté le 05/11/2013 21:43 | #
de rien
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 23/02/2014 21:22 | #
Pour revenir sur le sujet je comprens pas trop ce que renvoie cette fonction...
Si on lui donne en argument 2, elle va nous renvoyer laquelle de ces combinaisons:
0,1 ou 2
1,2
0,1
Merci d'avance
Ajouté le 23/02/2014 à 21:30 :
C'est bon j'ai trouvé (3 eme proposition) mais mais je comprends pas comment ca fonctionne...
Citer : Posté le 24/02/2014 17:19 | #
Si tu parle de la mienne, la voila commentée
//cette fonction renvoie un nombre aléatoire entre 0 et max-1
int random(int max)//si on envoie un nombre négatif, cela l'initialise, sinon cela défini le nombre max
{
static unsigned int seed = 0x12345678;//on retient le dernier nombre
if(max<1)seed=-max;//si on initialise, on remplace le dernier nombre
seed = (0x41C64E6D * seed) + 0x3039;//pour qu'il soit différent a chaque appel
if(max>0)return ((seed >> 16) % max);//on renvoye le nombre %max
}
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 24/02/2014 23:23 | #
Pfiou... Un peu trop dur pour moi
Je comprend pas la dexieme ligne ... Comment ça peut générer un nombre aléatoire
Citer : Posté le 25/02/2014 16:02 | #
En fait le static indique que la variable reste identique au prochain appel de la fonction. Et avec cela, le retour de la fonction sera différent a chaque appel. Mais pour qu'il soit différent a chaque lancement du programme, il faut initialiser la fonction, avec par exemple l'heure
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 25/02/2014 17:20 | #
Heu, pourquoi ne pas utiliser rand() ?
La même fonction que Dodormeur mais avec Rand() :
{
return rand()%max + min;
}
Randint(5, 9); retourne alors soit 5, 6, 7 ou 8.
Il faut juste penser à appeler srand(RTC_getTicks()); au tout début du programme
Citer : Posté le 25/02/2014 17:22 | #
Quelle est cette fonction RTC_getTicks() ?
Citer : Posté le 25/02/2014 17:23 | #
Au passage, j'ai supprimé mon message puisque je me suis aperçu qu'il y avait une boulette monstrueuse
Ajouté le 25/02/2014 à 17:26 :
RTC_getTicks() est un syscall qui retourne le nombre de frames (1/128ème de seconde) depuis une certaine date.
La calto possède une horloge qui tourne en permanence, même lorsqu'elle est éteinte, on peut donc accéder à ses valeurs
static int (*SysCall)(int R4, int R5, int R6, int R7, int FNo ) = (void*)&SysCallCode;
int RTC_getTicks()
{
return (*SysCall)(0, 0, 0, 0, 0x3B);
}
Citer : Posté le 25/02/2014 17:29 | #
Une fonction qui permet de connaitre le nombre de 1/128eme de seconde écoulée depuis minuit (selon le processeur)
Elle se trouve la dedans
#define SCA 0xD201D002
#define SCB 0x422B0009
#define SCE 0x80010070
typedef int(*sc_i2cp2sip) (char*, char*, short int*, short int*);
typedef int(*sc_iv) (void);
typedef int(*sc_4i) (int, int, int);
const unsigned int sc003b[] = {SCA, SCB, SCE, 0x3B};
const unsigned int sc0015[] = {SCA, SCB, SCE, 0x15};
const unsigned int sc0248[] = {SCA, SCB, SCE, 0x248};
#define RTC_GetTicks (*(sc_iv)sc003b)
#define PutKey (*(sc_4i)sc0248)
#define GlibGetOSVersionInfo (*(sc_i2cp2sip)sc0015)
int OSVersionAsInt(void)
{
unsigned char mainversion;
unsigned char minorversion;
unsigned short release;
unsigned short build;
GlibGetOSVersionInfo( &mainversion, &minorversion, &release, &build );
return ( ( mainversion << 24 ) & 0xFF000000 ) | ( ( minorversion << 16 ) & 0x00FF0000 ) | ( release & 0x0000FFFF );
}
#define isOS2 (OSVersionAsInt() >= 0x02020000)
#define OS2(x,y) ((OSVersionAsInt() >= 0x02020000)?y:x)
static int SysCallCode[] = {0xD201422B,0x60F20000,0x80010070};
static int (*SysCall)( int R4, int R5, int R6, int R7, int FNo ) = (void*)&SysCallCode;
void key_inject1(int keycode)
{
(*SysCall)(keycode, 0, 0, 0, 0x248);
}
int time_getTicks()
{
return RTC_GetTicks();
}
envie de plonger dans la mer pour ramasser des tresors? => ballon sea
envie de sauver l'univers dans un jeu avec une longue durée de vie? => saviors of the future
un add-in addictif avec plein de secret et de trophées => evasion survival
un shmup bien dur et sadique => saviors 2
merci a tout le monde pour son soutien
zelda prizm de smashmaster (en esperant qu'il puisse le finir)
les tests de marmotti
un RPG de dark storm
(dont je connais le nom, mais pas vous )Arcuz !Citer : Posté le 25/02/2014 17:33 | #
C'est donc là-dessus qu'est basé l'add-in horloge ?
Ajouté le 25/02/2014 à 17:46 :
Je crois que je viens de comprendre comment vous maniez les syscalls...
En fait vous mettez du code asm (compilé ?) dans la mémoire, en l'allouant soi-disant pour un tableau d'int, et vous créez une fonction que vous faites pointer à l'adresse du tableau.
Ainsi, quand vous appelez (*SysCall), la fonction executée est celle définie dans le premier tableau.
Et je suppose que pour le code assembleur vous placez un id dans un registre puis vous appelez le système ?
Citer : Posté le 25/02/2014 17:47 | #
En partie, oui
Citer : Posté le 25/02/2014 17:50 | #
C'est-à-dire ?
Eh oui je suis très collant quand je m'y mets
Citer : Posté le 25/02/2014 18:22 | #
Le "en partie" portait sur la première partie du message
Pour les syscalls, c'est l'abréviation de "system call". En gros, cents une fonction que l'on retrouve de base dan l'OS, et que l'on appelle via les pointeurs ci-dessus
Ca permet une plus grande rapidité pour une taille plus faible, puisqu'il n'y a rien a compiler