C++:
Satunnaislukujen generointi
Kuinka:
Satunnaislukujen generoimiseksi C++:ssa tyypillisesti käytetään <random>
otsikkotiedostoa, joka esiteltiin C++11:ssä, tarjoten laajan valikoiman välineitä satunnaislukujen generoimiseen eri jakautumista.
#include <iostream>
#include <random>
int main() {
// Alusta satunnaislukugeneraattori
std::random_device rd;
std::mt19937 gen(rd());
// Määritä väli [0, 99] mukaan lukien
std::uniform_int_distribution<> distrib(0, 99);
// Generoi ja tulosta 5 satunnaista lukua määritellyltä väliltä
for(int n=0; n<5; ++n)
std::cout << distrib(gen) << ' ';
return 0;
}
Tämä koodiesimerkki alustaa Mersenne Twister -satunnaislukugeneraattorin siemenarvolla, joka on otettu std::random_device
:stä. Sitten se määrittelee yhtenäisen kokonaislukujakautuman välille [0, 99] ja lopuksi tulostaa 5 satunnaista numeroa tästä jakautumasta.
Esimerkkitulostus saattaa näyttää tältä, mutta pidä mielessä, että jokainen suoritus tuottaa todennäköisesti erilaisia tuloksia:
45 67 32 23 88
Syväsukellus:
Historiallisesti satunnaislukujen generointi C++:ssa nojasi vahvasti rand()
-funktioon ja siemenarvon asettamiseen srand()
-funktiolla, jotka löytyvät <cstdlib>
otsikkotiedostosta. Tämä lähestymistapa sai kuitenkin usein kritiikkiä sen puutteellisen yhtenäisyyden ja ennustettavuuden vuoksi generoitujen numeroiden jakautumassa.
<random>
otsikkotiedoston esittely C++11:ssä merkitsi merkittävää parannusta, tarjoten kehittyneen järjestelmän satunnaisten lukujen tuottamiseen. Tarjotut välineet sisältävät valikoiman moottoreita (kuten std::mt19937
Mersenne Twisterille) ja jakautumia (kuten std::uniform_int_distribution
yhtenäiselle kokonaislukujen jakautumalle), joita voidaan yhdistellä ohjelmoijan erityistarpeiden mukaan, johtaen ennustettavampaan käytökseen, parempaan suorituskykyyn ja suurempaan joustavuuteen.
Vaikka <random>
kirjasto on paljon parempi kuin vanhempi rand()
-lähestymistapa, on syytä huomata, että todella satunnaisten lukujen generointi — erityisesti kryptografisiin tarkoituksiin — riippuu edelleen lisäharkinnoista. Kryptografisiin sovelluksiin tarkoitetut kirjastot, jotka usein hyödyntävät laitteistopohjaisia entropialähteitä, tulisi käyttää sen sijaan.