Namespaces
Variants

std:: cauchy_distribution

From cppreference.net
Défini dans l'en-tête <random>
template < class RealType = double >
class cauchy_distribution ;
(depuis C++11)

Produit des nombres aléatoires selon une distribution de Cauchy (également appelée distribution de Lorentz) :

f(x; a,b) =



1 +

x - a
b


2




-1
**Note:** Le contenu mathématique n'a pas été traduit car il s'agit d'une formule mathématique standard qui conserve la même notation dans toutes les langues. Les variables et symboles mathématiques (f, x, a, b, π) restent inchangés conformément aux conventions mathématiques internationales.

std::cauchy_distribution satisfait toutes les exigences de RandomNumberDistribution .

Table des matières

Paramètres du modèle

RealType - Le type de résultat généré par le générateur. L'effet est indéfini si ce n'est pas l'un des float , double , ou long double .

Types membres

Type de membre Définition
result_type (C++11) RealType
param_type (C++11) le type du jeu de paramètres, voir RandomNumberDistribution .

Fonctions membres

construit une nouvelle distribution
(fonction membre publique)
(C++11)
réinitialise l'état interne de la distribution
(fonction membre publique)
Génération
(C++11)
génère le prochain nombre aléatoire dans la distribution
(fonction membre publique)
Caractéristiques
(C++11)
retourne les paramètres de la distribution
(fonction membre publique)
(C++11)
obtient ou définit l'objet paramètre de distribution
(fonction membre publique)
(C++11)
retourne la valeur potentiellement générée minimale
(fonction membre publique)
(C++11)
retourne la valeur potentiellement générée maximale
(fonction membre publique)

Fonctions non membres

(C++11) (C++11) (supprimé en C++20)
compare deux objets de distribution
(fonction)
effectue l'entrée et la sortie de flux sur la distribution de nombres pseudo-aléatoires
(modèle de fonction)

Exemple

#include <algorithm>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <map>
#include <random>
#include <vector>
template<int Height = 5, int BarWidth = 1, int Padding = 1, int Offset = 0, class Seq>
void draw_vbars(Seq&& s, const bool DrawMinMax = true)
{
    static_assert(0 < Height and 0 < BarWidth and 0 <= Padding and 0 <= Offset);
    auto cout_n = [](auto&& v, int n = 1)
    {
        while (n-- > 0)
            std::cout << v;
    };
    const auto [min, max] = std::minmax_element(std::cbegin(s), std::cend(s));
    std::vector<std::div_t> qr;
    for (typedef decltype(*std::cbegin(s)) V; V e : s)
        qr.push_back(std::div(std::lerp(V(0), 8 * Height,
                                        (e - *min) / (*max - *min)), 8));
    for (auto h{Height}; h-- > 0; cout_n('\n'))
    {
        cout_n(' ', Offset);
        for (auto dv : qr)
        {
            const auto q{dv.quot}, r{dv.rem};
            unsigned char d[]{0xe2, 0x96, 0x88, 0}; // Bloc complet : '█'
            q < h ? d[0] = ' ', d[1] = 0 : q == h ? d[2] -= (7 - r) : 0;
            cout_n(d, BarWidth), cout_n(' ', Padding);
        }
        if (DrawMinMax && Height > 1)
            Height - 1 == h ? std::cout << "┬ " << *max:
                          h ? std::cout << "│ "
                            : std::cout << "┴ " << *min;
    }
}
int main()
{
    std::random_device rd{};
    std::mt19937 gen{rd()};
    auto cauchy = [&gen](const float x0, const float 𝛾)
    {
        std::cauchy_distribution<float> d{x0 /* a */, 𝛾 /* b */};
        const int norm = 1'00'00;
        const float cutoff = 0.005f;
        std::map<int, int> hist{};
        for (int n = 0; n != norm; ++n)
            ++hist[std::round(d(gen))];
        std::vector<float> bars;
        std::vector<int> indices;
        for (auto const& [n, p] : hist)
            if (float x = p * (1.0 / norm); cutoff < x)
            {
                bars.push_back(x);
                indices.push_back(n);
            }
        std::cout << "x₀ = " << x0 << ", 𝛾 = " << 𝛾 << ":\n";
        draw_vbars<4,3>(bars);
        for (int n : indices)
            std::cout << std::setw(2) << n << "  ";
        std::cout << "\n\n";
    };
    cauchy(/* x₀ = */ -2.0f, /* 𝛾 = */ 0.50f);
    cauchy(/* x₀ = */ +0.0f, /* 𝛾 = */ 1.25f);
}

Sortie possible :

x₀ = -2, 𝛾 = 0.5:
                    ███                     ┬ 0.5006
                    ███                     │
                ▂▂▂ ███ ▁▁▁                 │
▁▁▁ ▁▁▁ ▁▁▁ ▃▃▃ ███ ███ ███ ▂▂▂ ▁▁▁ ▁▁▁ ▁▁▁ ┴ 0.0076
-7  -6  -5  -4  -3  -2  -1   0   1   2   3
x₀ = 0, 𝛾 = 1.25:
                                ███                                 ┬ 0.2539
                            ▅▅▅ ███ ▃▃▃                             │
                        ▁▁▁ ███ ███ ███ ▁▁▁                         │
▁▁▁ ▁▁▁ ▁▁▁ ▁▁▁ ▃▃▃ ▅▅▅ ███ ███ ███ ███ ███ ▅▅▅ ▃▃▃ ▂▂▂ ▁▁▁ ▁▁▁ ▁▁▁ ┴ 0.0058
-8  -7  -6  -5  -4  -3  -2  -1   0   1   2   3   4   5   6   7   9

Liens externes

Weisstein, Eric W. "Distribution de Cauchy." De MathWorld — Une ressource Web Wolfram.