Ugrás a tartalomhoz

std::mt19937

A Wikiszótárból, a nyitott szótárból


Főnév

std::mt19937 (tsz. std::mt19937s)

  1. (informatika) A std::mt19937 a C++ egyik véletlenszám-generátora, amely az ún. Mersenne Twister 19937 algoritmust használja. Ez egy gyors és nagy periódusú (2¹⁹⁹³⁷ - 1 hosszú) véletlenszám-generátor, amely determinisztikus módon működik (ha azonos kezdőmagot állítunk be, mindig ugyanazokat a számokat adja vissza).



Alapok

A std::mt19937 az <random> fejlécre van szüksége, így ezt be kell illeszteni a program elején:

#include <iostream>
#include <random>

Létrehozás és inicializálás:

std::mt19937 rng(12345); // 12345 a seed (kezdőmag)

A kezdőmag (seed) beállítása fontos, mert ha mindig ugyanaz, akkor mindig ugyanazt a számfolyamot kapjuk. Ha minden futtatásnál más számokat szeretnénk, akkor használhatjuk a std::random_device-et:

std::random_device rd;
std::mt19937 rng(rd()); // Véletlenszerű seed a hardveres véletlenszám-generátorból

Véletlenszám-generálás

A std::mt19937 alapból unsigned int típusú számokat ad vissza a teljes tartományból (0 és 2^32 - 1 között):

std::cout << rng() << std::endl;

De a legtöbbször egy adott tartományban szeretnénk számokat, ezért kell hozzá egy eloszlás (distribution).

Egész számok generálása adott tartományban

Ha például 1 és 100 között szeretnénk egész számokat:

std::uniform_int_distribution<int> dist(1, 100);
int random_number = dist(rng);
std::cout << random_number << std::endl;

Lebegőpontos számok generálása

Ha például 0.0 és 1.0 között szeretnénk lebegőpontos számokat:

std::uniform_real_distribution<double> dist(0.0, 1.0);
double random_float = dist(rng);
std::cout << random_float << std::endl;

Különböző eloszlások

A std::mt19937-et sokféle eloszlással lehet kombinálni:

  • Normál (Gauss) eloszlás:

    std::normal_distribution<double> dist(50.0, 10.0); // Átlag: 50, szórás: 10
    double gauss = dist(rng);
    
  • Poisson-eloszlás:

    std::poisson_distribution<int> dist(4.0); // Átlagos eseményszám: 4
    int poisson = dist(rng);
    
  • Bernoulli (igaz/hamis) eloszlás:

    std::bernoulli_distribution dist(0.5); // 50% eséllyel igaz (true)
    bool bern = dist(rng);
    



Seed és determinisztikusság

Ha minden futtatásnál az ugyanolyan számokat szeretnéd kapni, akkor a std::mt19937 konstruktort egy fix számmal kell inicializálni (std::mt19937 rng(12345);). Ha minden futtatásnál eltérő számokat akarsz, akkor a std::random_device-et kell használni:

std::random_device rd;
std::mt19937 rng(rd());

Ez utóbbi garantálja, hogy minden futtatásnál eltérő véletlenszámokat kapsz.



Gyakorlati példa: Kockadobás (1-6)

Íme egy egyszerű kockadobó program:

#include <iostream>
#include <random>

int main() {
    std::random_device rd;
    std::mt19937 rng(rd());
    std::uniform_int_distribution<int> dice(1, 6);

    for (int i = 0; i < 5; ++i) {
        std::cout << "Dobás " << (i + 1) << ": " << dice(rng) << std::endl;
    }

    return 0;
}

Ez a program öt kockadobást generál és kiírja az eredményeket.



Összegzés

  • A std::mt19937 egy gyors és megbízható véletlenszám-generátor.
  • Használatához <random> fejlécre van szükség.
  • Fix seed esetén determinisztikus (ugyanazokat a számokat adja).
  • Véletlenszerű seed esetén minden futtatás más számokat ad.
  • A véletlenszámok tartományát és típusát eloszlásokkal lehet szabályozni (std::uniform_int_distribution, std::uniform_real_distribution, stb.).