Maison >développement back-end >C++ >Comment générer des nombres aléatoires normalement distribués en C/C sans Boost ?

Comment générer des nombres aléatoires normalement distribués en C/C sans Boost ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-23 00:55:16978parcourir

How to Generate Normally Distributed Random Numbers in C/C   Without Boost?

Générer des nombres aléatoires avec une distribution normale en C/C

Question :

Comment générer facilement des nombres aléatoires suivre une distribution normale en C ou C sans utiliser Boost bibliothèques ?

Réponse :

Transformation de Box-Muller

La transformation de Box-Muller est une méthode largement utilisée pour générer nombres normalement distribués à partir d’un générateur de nombres aléatoires uniformes. Il produit des valeurs qui adhèrent avec précision à une distribution gaussienne.

La formule mathématique de la transformation de Box-Muller est la suivante :

x = sqrt(-2 * log(U1)) * cos(2 * π * U2)
y = sqrt(-2 * log(U1)) * sin(2 * π * U2)

où :

  • U1 et U2 sont des nombres aléatoires uniformément distribués entre 0 et 1
  • x et y sont des nombres aléatoires normalement distribués avec une moyenne de 0 et un écart type 1

Implémentation :

Pour implémenter la transformation Box-Muller en C/C , vous pouvez utiliser le code suivant :

#include <cmath>
#include <random>

double box_muller() {
  std::random_device rd;  // Seed the random number generator with a system clock seed
  std::default_random_engine rng(rd());
  std::uniform_real_distribution<double> dist(0.0, 1.0);

  double U1 = dist(rng);
  double U2 = dist(rng);

  double x = sqrt(-2 * log(U1)) * cos(2 * M_PI * U2);
  return x;
}

Utilisation :

Pour générer un nombre aléatoire normalement distribué, appelez simplement le Fonction box_muller() :

double random_number = box_muller();

La valeur de random_number sera une variable aléatoire distribuée gaussienne avec une moyenne de 0 et un écart type de 1.

Remarque :

  • La transformation Box-Muller produit également un deuxième résultat, y, mais celui-ci peut être ignoré ou enregistré pour plus tard. utiliser.
  • Si vous devez générer des nombres normalement distribués avec une moyenne autre que 0 ou un écart type autre que 1, vous pouvez multiplier le résultat par une constante.

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