std::bernoulli_distribution în C++

Produce true cu probabilitatea p și false în rest: un „da sau nu” aleatoriu, ca o monedă (eventual măsluită).

Sintaxă
std::bernoulli_distribution dist(p);
bool rezultat = dist(generator);

Ce face std::bernoulli_distribution

std::bernoulli_distribution(p) returnează bool: true cu probabilitatea p (între 0 și 1), false cu probabilitatea 1 - p. Fără argument, p este 0.5, ca o monedă corectă.

Este mai clar decât uniform_real_distribution(0, 1)(gen) < p și spune direct intenția: un eveniment care are loc cu o anumită șansă.

Parametri

Parametru Descriere
p Probabilitatea lui true, între 0 și 1.
generator La apel: un generator.

Ce returnează

La fiecare apel, true sau false.

Exemple

Exemplul 1: Aruncarea unei monede

#include <print>
#include <random>

int main() {
    std::mt19937 gen(std::random_device{}());
    std::bernoulli_distribution moneda;

    for (int i = 0; i < 5; ++i) {
        std::print("{} ", moneda(gen) ? "Cap" : "Ban");
    }
    std::println("");
}

Rezultat posibil (diferă la fiecare rulare)

Cap Ban Ban Cap Cap

Exemplul 2: Șansă de 30% de ploaie

Pe 1000 de zile simulate, aproximativ 300 sunt ploioase. Generatorul std::mt19937 cu seed fix produce aceleași numere pe orice compilator, dar modul în care o distribuție le transformă nu este fixat de standard. Rezultatul de mai jos este cel dat de libc++ (Clang); cu GCC sau MSVC, același seed poate da alte valori.

#include <print>
#include <random>

int main() {
    std::mt19937 gen(99);
    std::bernoulli_distribution ploua(0.3);

    int zile_ploioase = 0;
    for (int zi = 0; zi < 1000; ++zi) {
        if (ploua(gen)) {
            ++zile_ploioase;
        }
    }
    std::println("Zile ploioase: {} din 1000", zile_ploioase);
    std::println("Probabilitatea setată: {}", ploua.p());
}

Rezultat

Zile ploioase: 309 din 1000
Probabilitatea setată: 0.3

Greșeli frecvente

  • Dai probabilitatea în procente (bernoulli_distribution(30)): valoarea trebuie să fie între 0 și 1 (0.3).

Comenzi înrudite

  • std::uniform_real_distribution: Produce numere cu virgulă aleatorii, distribuite uniform în intervalul [a, b).
  • std::discrete_distribution: Alege aleatoriu un index 0, 1, 2… cu probabilități proporționale cu ponderile date.
  • std::mt19937: Generatorul Mersenne Twister: numere pseudo-aleatorii rapide și de calitate, reproductibile cu un seed fix.