Maison >développement back-end >C++ >Comment le générateur de nombres aléatoires de Boost peut-il être utilisé pour la sélection de nombres aléatoires pondérés ?

Comment le générateur de nombres aléatoires de Boost peut-il être utilisé pour la sélection de nombres aléatoires pondérés ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-15 20:43:13494parcourir

How Can Boost's Random Number Generator Be Used for Weighted Random Number Selection?

Génération de nombres aléatoires pondérés

Le choix de nombres aléatoires avec des probabilités spécifiques est une tâche courante en programmation. Le générateur de nombres aléatoires de Boost offre un moyen pratique de sélectionner des éléments avec des probabilités pondérées.

Considérez le scénario dans lequel vous souhaitez choisir un nombre aléatoire entre 1 et 3 avec les poids suivants :

  • 1 : 90 %
  • 2 : 56%
  • 3 : 4%

Algorithme

Boost n'a pas de fonctionnalité intégrée pour la génération de nombres aléatoires pondérés. Cependant, il existe un algorithme simple qui peut être appliqué :

  1. Calculer le poids total : Additionner les poids de tous les articles.
  2. Générer un Nombre aléatoire : Choisissez un nombre aléatoire entre 0 et le poids total.
  3. Parcourez Poids : Parcourez le poids de chaque article, en le soustrayant du nombre aléatoire jusqu'à ce que le nombre devienne inférieur au poids de l'article actuel.
  4. Retourner l'article : L'article correspondant à la position où le nombre aléatoire devenu négatif est l'article choisi.

Code Exemple

Dans Boost, en utilisant le générateur de nombres aléatoires random_device et mt19937 :

std::mt19937 rng(std::random_device{}());
int total_weight = 90 + 56 + 4;
for (int i = 0; i < total_weight; i++) {
    int random_number = rng() % total_weight;
    int current_weight = 90;
    if (random_number < current_weight) {
        return 1;
    }
    current_weight += 56;
    if (random_number < current_weight) {
        return 2;
    }
    return 3; // Reached the end of the weights
}

Optimisations

Si les poids changent rarement et sont aléatoires les sélections sont fréquentes, une optimisation peut être appliquée en stockant la somme des poids cumulés dans chaque article. Cela permet une approche de recherche binaire plus efficace.

De plus, si le nombre d'éléments est inconnu mais que les poids sont connus, l'échantillonnage en réservoir peut être adapté pour la génération de nombres aléatoires pondérés.

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