Generera slumptal

C++:
Generera slumptal

Hur man gör:

För att generera slumpmässiga tal i C++ använder man sig vanligtvis av <random>-headern, som introducerades i C++11, och som erbjuder ett brett utbud av faciliteter för att generera slumpmässiga tal från olika distributioner.

#include <iostream>
#include <random>

int main() {
    // Initiera en slumpgenerator
    std::random_device rd;  
    std::mt19937 gen(rd()); 

    // Definiera intervallet [0, 99] inklusive
    std::uniform_int_distribution<> distrib(0, 99); 

    // Generera och skriv ut 5 slumpmässiga tal inom det definierade intervallet
    for(int n=0; n<5; ++n)
        std::cout << distrib(gen) << ' ';
    return 0;
}

Denna kodexempel initierar en Mersenne Twister-slumptalsgenerator med ett frö från std::random_device. Sedan definieras en likformig heltalsdistribution i intervallet [0, 99] och slutligen skrivs 5 slumpmässiga tal ut från denna distribution.

Exempel på utdata kan se ut så här, men kom ihåg att varje körning sannolikt kommer att producera olika resultat:

45 67 32 23 88

Fördjupning:

Historiskt sett har generering av slumpmässiga tal i C++ i hög grad förlitat sig på funktionen rand() och funktionen srand() för seedning, som finns i <cstdlib>-headern. Denna metod har dock ofta kritiserats för sin brist på uniformitet och förutsägbarhet i fördelningen av genererade tal.

Introduktionen av <random>-headern i C++11 markerade en betydande förbättring och erbjöd ett sofistikerat system för att producera slumpmässiga tal. De faciliteter som tillhandahålls inkluderar en mängd motorer (som std::mt19937 för Mersenne Twister) och distributioner (som std::uniform_int_distribution för likformig fördelning av heltal) som kan kombineras för att passa programmörens specifika behov, vilket leder till mer förutsägbart beteende, bättre prestanda och större flexibilitet.

Även om <random>-biblioteket är mycket bättre än den äldre rand()-metoden, är det värt att notera att generering av verkligt slumpmässiga tal – särskilt för kryptografiska ändamål – fortfarande bygger på ytterligare överväganden. För kryptografiska applikationer bör bibliotek som specifikt är utformade för säkerhet och som ofta använder sig av hårdvarubaserade entropikällor användas istället.