Maison > développement back-end > C++ > le corps du texte

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

Patricia Arquette
Libérer: 2024-11-23 00:55:16
original
925 Les gens l'ont consulté

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)
Copier après la connexion

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;
}
Copier après la connexion

Utilisation :

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

double random_number = box_muller();
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal