Générez de véritables nombres aléatoires en C : guide complet de rand() et srand()

1. Comment générer des nombres aléatoires en C : la fonction rand()

1.1 Qu’est‑ce que la fonction rand() ?

La fonction rand() en C sert à générer des nombres pseudo‑aléatoires. Les nombres pseudo‑aléatoires sont des suites produites par un algorithme prédéfini ; bien qu’ils ne soient pas réellement aléatoires, ils sont suffisants pour la plupart des usages généraux. rand() renvoie un entier compris entre 0 et 32767. Cette plage peut varier selon le système, mais c’est la valeur la plus courante.

1.2 Utilisation de base de la fonction rand()

Pour utiliser la fonction rand(), il faut inclure stdlib.h. Le code suivant est un exemple basique de génération d’un nombre aléatoire avec rand().

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

int main(void) {
    int randomNumber = rand(); 
    printf("Generated random number: %d\n", randomNumber);
    return 0;
}

L’exécution de ce code affichera un nombre aléatoire compris entre 0 et 32767. Cependant, un inconvénient est que le même nombre aléatoire sera généré à chaque exécution. Nous aborderons ce point plus en détail plus tard.

2. Ajuster la plage des nombres aléatoires

2.1 Limiter la plage à l’aide de l’opérateur modulo

Lors de la génération de nombres aléatoires, il est souvent nécessaire d’obtenir des valeurs dans une plage précise. Par exemple, pour générer un nombre aléatoire compris entre 1 et 100, on peut ajuster la sortie de la fonction rand() à l’aide de l’opérateur modulo %.

int numberInRange = rand() % 100 + 1; // Generates a random number from 1 to 100

Dans cet exemple, on récupère le reste de la division de la sortie de rand() par 100, puis on ajoute 1 pour obtenir un nombre aléatoire compris entre 1 et 100. L’utilisation de l’opérateur modulo rend facile la génération de nombres aléatoires dans n’importe quelle plage souhaitée.

2.2 Générer des nombres aléatoires sur une plage spécifique

Pour un contrôle plus souple de la plage des nombres aléatoires, vous pouvez créer et utiliser une fonction personnalisée. Voici un exemple de fonction qui génère un nombre aléatoire compris entre une valeur minimale et maximale spécifiées.

int getRandomNumber(int min, int max) {
    return rand() % (max - min + 1) + min;
}

En utilisant cette fonction, vous pouvez générer des nombres aléatoires dans n’importe quelle plage, par exemple getRandomNumber(1, 100).

侍エンジニア塾

3. Modifier les motifs des nombres aléatoires avec srand()

3.1 Qu’est‑ce que la fonction srand() ?

Si vous utilisez la fonction rand() telle quelle, le même motif de nombres aléatoires sera généré à chaque exécution du programme. C’est une caractéristique des nombres pseudo‑aléatoires : elle est pratique pour le débogage mais problématique lorsqu’une vraie aléatoire est requise. Pour y remédier, vous pouvez utiliser la fonction srand() afin de définir la graine du générateur de nombres aléatoires, ce qui change le motif des nombres produits.

3.2 Comment utiliser la fonction srand()

La fonction srand() est appelée avant rand() pour spécifier la graine du générateur. En général, on utilise srand((unsigned int)time(NULL)) pour définir l’heure actuelle comme graine.

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

int main(void) {
    srand((unsigned int)time(NULL)); // Set current time as seed
    int randomNumber = rand(); 
    printf("Generated random number: %d\n", randomNumber);
    return 0;
}

Dans ce code, srand() génère un motif de nombres aléatoires différent à chaque exécution. Comme time(NULL) renvoie l’heure actuelle en secondes, il est possible de définir une graine différente à chaque fois.

4. Applications pratiques des nombres aléatoires

4.1 Utilisation des nombres aléatoires dans les jeux

Les nombres aléatoires sont fréquemment employés dans le développement de jeux. Par exemple, ils servent à placer aléatoirement des personnages ou à déterminer les probabilités de chute d’objets. Voici un exemple de simulation de lancer de dés.

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

int main(void) {
    srand((unsigned int)time(NULL)); // Set the seed
    int diceRoll = rand() % 6 + 1; // Generate a random number from 1 to 6
    printf("Dice roll: %d\n", diceRoll);
    return 0;
}

Ce programme génère un nombre aléatoire de 1 à 6, l’affichant comme un lancer de dé. En utilisant des nombres aléatoires, vous pouvez facilement implémenter des éléments imprévisibles dans les jeux.

4.2 Simulation Monte Carlo

Les nombres aléatoires sont également utilisés dans des simulations comme la méthode de Monte-Carlo. La méthode de Monte-Carlo utilise des nombres aléatoires pour approximer des solutions à des problèmes difficiles à résoudre analytiquement. Par exemple, vous pouvez approximer la valeur de Pi (π) en utilisant des nombres aléatoires.

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

int main(void) {
    int n_trials = 1000000;
    int n_inside = 0;
    double x, y, pi;

    srand((unsigned int)time(NULL));

    for (int i = 0; i < n_trials; i++) {
        x = (double)rand() / RAND_MAX;
        y = (double)rand() / RAND_MAX;
        if (x * x + y * y <= 1) {
            n_inside++;
        }
    }

    pi = 4.0 * n_inside / n_trials;
    printf("Approximated π: %f\n", pi);

    return 0;
}

Ce programme est un exemple de la méthode de Monte-Carlo approximant Pi en utilisant des points aléatoires. Il utilise rand() pour générer des nombres aléatoires dans la plage de 0 à 1, et les utilise ensuite pour approximer l’aire d’un cercle.

5. Considérations importantes pour rand() et srand()

5.1 Comprendre la pseudo-aléatoricité

Les nombres aléatoires générés par la fonction rand() de C sont pseudo-aléatoires. Ils ne sont pas vraiment aléatoires mais sont calculés sur la base d’un algorithme interne, ce qui signifie que l’utilisation de la même graine produira le même motif de nombres aléatoires. Bien que cela soit utile pour le débogage, ce n’est pas adapté lorsque une véritable aléatoricité est requise.

5.2 Erreurs courantes

Les erreurs courantes lors de l’utilisation de nombres aléatoires incluent ne pas utiliser srand() ou mal comprendre la plage de sortie de rand(). Spécifiquement, si vous ne définissez pas une graine avec srand() avant d’utiliser rand(), le même motif de nombres aléatoires sera généré à chaque fois. De plus, lors de l’ajustement de la plage avec rand() % n, soyez prudent car la valeur de n peut mener à des résultats non intentionnels.

Conclusion

La génération de nombres aléatoires en C est utilisée dans divers domaines, tels que les jeux et les simulations. En comprenant comment utiliser les fonctions rand() et srand() et en générant correctement des nombres aléatoires, vous pouvez ajouter des éléments imprévisibles à vos programmes. Référez-vous à cet article et essayez de créer des programmes qui utilisent des nombres aléatoires.