Comment générer une valeur aléatoire ?

Tirage pseudo-aléatoire...

Pour générer une valeur aléatoire entière, il faut utiliser la fonction int rand(void);. Mais attention, il faut savoir que cette fonction ne renvoie pas une valeur complètement aléatoire, puisque la valeur retournée lors du nième appel de cette fonction n'est en fait que le nième terme d'une suite de valeurs pseudo-aléatoires, générée à partir de la première valeur. Or, par défaut cette valeur initiale est toujours la même !! Ceci veut dire que si on exécute le tirage de 10 nombres (voir programme ci-dessous), on obtient toujours la même suite de 10 valeurs... Par exemple, sur ma machine j'obtiens inlassablement la séquence : 41, 18467, 6334, 26500, 19169, 15724, 11478, 29358, 26962, 24464.

int i, var_aleatoire;
for(i=0;i<10;i++)            // génération d'une suite de 10 valeurs pseudo-aléatoires
        
{
    var_aleatoire=rand();
    printf("%d \n", var_aleatoire);
}

Un peu plus aléatoire ??

Pour faire en sorte que la suite de valeurs soit un peu plus aléatoire, il faut modifier la première valeur, puisque c'est elle qui va engendrer toutes les autres. Une solution couramment utilisée consiste à initialiser cette valeur de départ en se référant à l'heure courante, puisqu'elle varie constamment !! Pour cela, on utilise la fonction void srand(unsigned int val_init); qui fixe la première valeur de la suite pseudo-aléatoire à val_init et la fonction int time(NULL); qui renvoie le nombre de secondes (nombre entier) écoulées depuis le 1er janvier 1970. Aujourd'hui (7 mars 2008), il s'est déjà écoulé ... 1 204 907 798 secondes !! (Mais au fait, il faut combien d'octets pour stocker cette valeur ??).  Donc, pour avoir un tirage vraiment aléatoire, il suffit d'insérer la ligne de code suivante au début du programme, sans oublier d'inclure la bibliothèque <time.h> :

srand(time(NULL));

Pour avoir des valeurs dans un intervalle donné

Par défaut, la fonction rand() génère des valeurs comprises entre 0 et la constante RAND_MAX (32767, mais dépend de la machine). Cependant, dans un jeu, on peut vouloir un tirage aléatoire dans un intervalle différent. Par exemple, un dé devra sortir des valeurs comprises entre 1 et 6 et, un jeu de loto des nombres de 1 à 49. Aussi, si on veut placer un objet de manière aléatoire dans une fenêtre graphique de dimension (XMAX,YMAX), il faudra évidemment que les coordonnées aléatoires de l'objet soient comprises entre 0 et XMAX en abscisse et 0 et YMAX en ordonnée (moins la largeur de l'objet si nécessaire...). Bref, comment faire pour changer l'intervalle des valeurs aléatoires ?

valeur_de=rand()*6/RAND_MAX+1;        // tirage aléatoire de valeurs entières comprises entre 1 et 6

valeur_de=rand()%6+1;        // tirage aléatoire de valeurs entières comprises entre 1 et 6