Maison >développement back-end >C++ >Comment puis-je générer des nombres aléatoires véritablement uniformes dans une plage spécifique en C ?

Comment puis-je générer des nombres aléatoires véritablement uniformes dans une plage spécifique en C ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-25 15:58:10160parcourir

How can I generate truly uniform random numbers within a specific range in C  ?

Générer des nombres aléatoires uniformément sur une plage entière

Pour générer des nombres aléatoires dans un intervalle spécifié [min, max ] uniformément, les lignes directrices suivantes doivent être considéré :

Éviter d'utiliser rand() et l'opérateur Modulo

Utiliser rand() et l'opérateur modulo, comme démontré dans l'extrait de code donné, peut ne pas produire de nombres aléatoires uniformément distribués. Cela dépend de la plage et de la valeur de RAND_MAX.

C 11 Uniform Integer Distribution

Avec C 11, vous peut utiliser std::uniform_int_distribution pour générer des nombres aléatoires dans un range:

#include <iostream>
#include <random>

int main() {
    const int range_from = 0;
    const int range_to = 1000;
    std::random_device rand_dev;
    std::mt19937 generator(rand_dev());
    std::uniform_int_distribution<int> distr(range_from, range_to);

    std::cout << distr(generator) << '\n';
}

Autres générateurs de nombres aléatoires

C 11 fournit des générateurs de nombres aléatoires supplémentaires avec diverses distributions, telles que comme Bernoulli, Poisson et normal.

Mélange des conteneurs

Pour mélanger un conteneur de manière aléatoire, utilisez std::shuffle:

#include <iostream>
#include <random>
#include <vector>

int main() {
    std::vector<int> vec = {4, 8, 15, 16, 23, 42};

    std::random_device random_dev;
    std::mt19937 generator(random_dev());

    std::shuffle(vec.begin(), vec.end(), generator);
    std::for_each(vec.begin(), vec.end(), [](auto i){std::cout << i << '\n';});
}

Boost.Random

Si C 11 n'est pas disponible, vous pouvez utiliser Boost.Random, qui propose une interface similaire à la génération de nombres aléatoires de C 11 installations.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn