Forum Clubic

Generer un code aleatoire en c++

bonjour je cherche a generer un nombre aleatoire en c++
j’ai cru voir que cetait la fonction rand();

qq1 sais s’en servir
merci

Un petit programme pour comprendre rand et srand:


#include <time.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
     // on initialise le générateur pour avoir des suites différentes
     //  (time(NULL) permet d'utiliser le temps comme graine du générateur)
     srand(time(NULL));

     unsigned int nb;
     // on va rechercher un nouveau nombre (et on s'arrête lorsque nb égale 0)
     while(nb = rand())
     {
          // affichage du nombre généré
          printf("%d\n", nb);
     }

     system("PAUSE");
}

srand permet de créer une nouvelle sutie de nombres aléatoires. Si on appel pas srand on aura toujours la même suite! À srand on donne en paramètre un nouvelle graine pour généré la suite.
Quant à rand elle permet d’extraire un nouveau chiffre dans la suite.
Edité le 19/08/2007 à 20:11

je tavou que je comprend pas comment on declare et se sert de rand() srand()

dison un programme simple:

include <iostream.h>

int main ()
{
int aleatoire;

int min=0;
int max= 20;

//je souhaite que la var “aleatoire” soit aleatoirement comprise entre “min” et “max”

}
merci

cf. code du dessus.

Là où tu as nb, fais 1 + (nb % 20). Ce n’est pas la meilleure façon, mais bref.

pr generer 6 nombres alétoirement entre 0 et 10

#include <iostream.h>
#include <time.h>
#include <stdlib.h>

int main ()
{
int n1,n2,n3,n4,n5,n6;
srand(time(NULL));

n1 = rand() % 11;
cout << n1 << “-” ;

n2 = rand() % 11;
cout << n2 << “-” ;

n3 = rand() % 11;
cout << n3 << “-” ;

n4 = rand() % 11;
cout << n4 << “-” ;

n5 = rand() % 11;
cout << n5 << “-” ;

n6 = rand() % 11;
cout << n6;

cout << endl;

system(“pause”);
}


je sais je me fait chier mais cest pour les avoir alignés…
merci Sans-Nom et Dusty

voilà.

Par contre, si tu es en C++ tu n’as pas à mettre le “.h” en théorie.

et pareil mais ne pas avoir les memes par ex comme le tirage du loto

sur 5 nombres sur 50 il me semble jamais identiques ??

Tu peux créer un tableau de 50 booléens. Tu les initialises tous à false, puis, lorsque tu récupères une valeur avec rand() tu mets l’indice de la valeur trouvée à true.

Attention, pour ne pas faire ramer ta machine dans le cas où tu aurais beaucoup de nombre à tirer, il faut récupérer le nombre de décalage (depuis la dernière valeur prise) à faire dans le tableau et pas un numéro absolu. Ceci parce que quand on a choisi 49 nombres, il prendra beaucoup de temps de prendre le dernier alors qu’on le connait!

Autre chose, pour récupérer le nombre de décalages à effectuer il faut faire un modulo N (pour limiter le nombre de décalage à ceux qui sont utiles).

Enfin bon, j’espère que vous avez compris mon charabia de minuit :paf:

Non :slight_smile:

mais je suppose que :

bool numbers = new bool50; // initialisation à false, àvoir, ou à faire à la main via un for

for (int i = 0; i < 6; ++i) {
int n = 0;
do {
n = rand() % 50; // 0 - 49
} while (numbers[n]);
numbers[n] = true;
}

Et pouf :slight_smile:

Tu me croiras pas Sans-Nom mais c’est exactement ce à quoi je pensais!
Tu lis dans mes pensées! :paf:

Mais je pensais qu’il fallait tirer tous les nombres et pas que 6 (moi et le loto ça fait deux).

Tss :slight_smile:

tiens vla une fonction proto en C :

/*  fonction de generation d un nombre aleatoire  compris entre les bornes inf et sup */

int genereNombre (int inf, int sup)
{
srand(time(NULL));
int nombre = (rand() % (sup - inf + 1)) + inf;
return nombre; /* renvoi du nombre */
}

et ton bout de code C++ corrigé :

#include <iostream>
#include <time.h>
using namespace std;

int main ()
{
int n1,n2,n3,n4,n5,n6;
srand(time(NULL));

n1 = rand() % 11;
cout << n1 << "-" ;

n2 = rand() % 11;
cout << n2 << "-" ;

n3 = rand() % 11;
cout << n3 << "-" ;

n4 = rand() % 11;
cout << n4 << "-" ;

n5 = rand() % 11;
cout << n5 << "-" ;

n6 = rand() % 11;
cout << n6;

cout << endl;
system("pause");
return 0;
}

Edité le 25/08/2007 à 04:07

petit détérage de topic car je m’interessait à la question et j’ai fait un programme de test qui me semble t il est tres explicite:

.#include
#include <time.h>

using namespace std;

int pifometre(int,int);

int main()
{
// initialisation du générateur de nombres pseudo-aléatoire
srand( time( NULL ) );
int fourchette=10.;
int val=12000;

cout << ( double(rand()) / (double(RAND_MAX)) ) << endl; //0.982208
cout << ( double(rand()) / (double(RAND_MAX)) ) * fourchette << endl; // pourcentage aléatoire de la fourchette
cout << (( double(rand()) / (double(RAND_MAX)) ) * fourchette ) -fourchette/2 << endl; //centrer le résultat autour de 0
cout << ((( double(rand()) / (double(RAND_MAX)) ) * fourchette ) -fourchette/2) + val << endl; //ajouter (ou soustraire selon le signe du resultat autour de 0) à la valeur transmise

cout << “Test avec la fonction pifometre” << endl;

cout << pifometre(val,fourchette);

return 0;

}

int pifometre(int val, int fourchette)
{
return (((double(rand())/(double(RAND_MAX)))*fourchette)-fourchette/2)+val;
}

Pour evité de crée plusieurs faire le meme nombre il serais plus “correct” de crée tout les nombres aléatoire possible dans le cas ou le nombre de possibilité est petite et que le nombre de valeurs à tiré est proche de se nombre.

Dans le cas d’un rand entre 1 et 100, si il faut tiré 90 nombre parmis ceux là, le chance de tiré un nombre déjà tiré est de 90%, ce qui fait pas mal de pass dans la boucle pour tiré un des 10 nombres restant.

Le moyen est de crée un vecteur avec tout les nombres possible. On tire un nombre au hasard entre 0 et la taille du vecteur. Quand une valeur est tiré, on supprime cette valeur du vecteur, on est sur de jamais tiré deux fois la meme.


Entier maxRand
Entier nbRand
Vecteur v d'Entier

Pour i de 0 à maxRand Faire
  v.ajout( i );
FinPour

Pour i de 1 à nbRand Faire
  afficher( v.retirer( rand( 0, v.taille() ) );
FinPour

Il est evidant que si le rand doit etre fait entre 0 et 1000000 et que l’on veux 5 nombres cette méthode est plus gourmente en mémoire. Les chance pour tiré 2 fois le meme nombre dans ce cas son mince.
Edité le 19/07/2009 à 20:20

Sauf que le propre de l’aléatoire, c’est d’être aléatoire !

Il est normal donc de retomber sur les mêmes nombres de temps en temps. Ceci étant, tu es dans le domaine du pseudo aléatoire. Toutes ces générations se basent sur des séquences (une suite, donc), qui elle n’est pas aléatoire. ça le serait un peu plus en prenant par exemple la taille du tas, l’heure système, le temps CPU, etc en considération.

=> www.xgc.com…

unsigned long next = 1;
int rand (void)
{
  next = next * 1103515245L + 12345L;
  return (unsigned int)((next > 16) & 0x7fff; 
}
void 
srand (unsigned int seed)
{
 next = seed;
}

Edité le 19/07/2009 à 20:56

Je suis d’accord, que de pas prendre en compte les valeurs déjà trouvé c’est plus de l’aléatoire (meme si ca l’était déjà pas au debut). Mais je parlais au niveau code pour ne pas retombé sur les mêmes valeurs, c’est plus “correct” de supprimé la valeur des possibilité que de rebouclé si tu tombes dessus à chaque fois. Imagine tu veux sortir 1000 nombres dans un ordre pseudo aléatoire de 0 à 999. En faisant un rand à chaque fois entre ces 1000 possibilité avant de sortir les derniers nombre ca va faire pas mal d’itération dans le vent.

Mais en supprimant une valeur des possibilités tu augmente la probabilités des autres valeurs non ?
(j’avoue cependant ne pas avoir suivi toute l’histoire, notamment le pourquoi de ne pas vouloir des valeurs identiques)

Le but de ce qu’avais mit sans-nom était de pas tiré 2 fois la même valeur. On met à vrai le bool correspondant à la valeur trouvé. Si un tire un valeur pour le quel le bool est déjà vrai on recommance. Mais ca fausse tout autant les possibilité de tombé sur les autres valeurs. Mais avec une solution comme j’ai donné, on fait pas de multiple boucle pour rand() un autre nombre car on fait que de tombé sur des nombres déjà tiré. Il est evidant que si on tire 5 nombre entre 0 et 4, sans vouloir 2 fois le meme nombre, arrivé au 5 eme il y a 100% de chance pour que ca sois le seul nombre restant que sois tiré au sort. Sauf que dans un cas on a 4 chances sur 5 à chaque boucle de tombé sur un nombre déjà trouvé, et donc de perdre du temps à rebouclé pour rien.
Edité le 20/07/2009 à 13:58

Hé bien si ta séquence est suffisamment large/aléatoire pour que tu ne retombes jamais deux fois sur le même nombre, tu n’as pas besoin de faire ça.

Oui mais non, je parle dans le cas ou justement, on veux par exemple tiré des nombres index dans un tableau de 50 entier, sans jamais tombé sur le meme index. Pour trier le tableau en pseudo-hasard. Dans ce cas, ma solution s’applique.