std::mt19937
Főnév
std::mt19937 (tsz. std::mt19937s)
- (informatika) A
std::mt19937a 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::mt19937egy 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.).
- std::mt19937 - Szótár.net (en-hu)
- std::mt19937 - Sztaki (en-hu)
- std::mt19937 - Merriam–Webster
- std::mt19937 - Cambridge
- std::mt19937 - WordNet
- std::mt19937 - Яндекс (en-ru)
- std::mt19937 - Google (en-hu)
- std::mt19937 - Wikidata
- std::mt19937 - Wikipédia (angol)