C++ Academy · Lektion

Korrekt initialisering

Opnå reproducerbar tilfældighed

Lektion 3 af 413 trin

Korrekt initialisering er en gratis C++ Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i C++ Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C++ Academy-kurset indeholder 4 lektioner i alt.

Hvad er initialisering?

En startværdi er generatorens begyndelsestilstand. Den samme startværdi genskaber den samme sekvens, mens en anden startværdi giver en anden sekvens.

#include <iostream>
#include <random>

int main() {
    std::mt19937 a(100), b(200);
    std::cout << std::boolalpha << (a() == b()) << '\n';
    return 0;
}

Fast startværdi for reproducerbarhed

En konstant startværdi giver gentagelige resultater, hvilket er ideelt til afprøvning og fejlfinding.

#include <iostream>
#include <random>

int main() {
    auto run = [](unsigned s) {
        std::mt19937 g(s);
        return g() % 1000;
    };
    std::cout << run(42) << ' ' << run(42) << '\n';
    return 0;
}

std::random_device

std::random_device leverer ikke-deterministiske startværdier fra operativsystemet. Brug den én gang til at initialisere generatoren.

#include <iostream>
#include <random>

int main() {
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<int> d(1, 6);
    std::cout << "a roll: " << d(gen) << '\n';
    return 0;
}

Initialisér én gang, og genbrug

Initialisér generatoren én enkelt gang ved opstart. Geninitialisering før hver udtrækning forringer tilfældighedens kvalitet.

#include <iostream>
#include <random>

int main() {
    std::random_device rd;
    std::mt19937 gen(rd());            // seed once
    std::uniform_int_distribution<int> d(1, 100);
    for (int i = 0; i < 3; ++i) std::cout << d(gen) << ' ';
    std::cout << '\n';
    return 0;
}

Problemet med tidsbaserede startværdier

Initialisering med time(nullptr) ændrer sig kun én gang i sekundet, så programmer, der startes samtidig, får den samme sekvens. Foretræk random_device.

#include <iostream>
#include <random>
#include <ctime>

int main() {
    std::mt19937 gen(static_cast<unsigned>(std::time(nullptr)));
    std::cout << "seeded from time (coarse)\n";
    std::cout << (gen() % 100) << '\n';
    return 0;
}

Initialisering med seed_seq

En generator har en stor intern tilstand. std::seed_seq fordeler flere startværdier over hele tilstanden, så initialiseringen bliver bedre.

#include <iostream>
#include <random>

int main() {
    std::seed_seq seq{1, 2, 3, 4};
    std::mt19937 gen(seq);
    std::cout << (gen() % 1000) << '\n';
    return 0;
}

Kombination af værdier fra random_device

Hvis du vil opnå en initialisering af høj kvalitet, skal du samle flere værdier fra random_device i en seed_seq.

#include <iostream>
#include <random>
#include <array>

int main() {
    std::random_device rd;
    std::array<unsigned, 4> seeds{rd(), rd(), rd(), rd()};
    std::seed_seq seq(seeds.begin(), seeds.end());
    std::mt19937 gen(seq);
    std::cout << "well-seeded engine ready\n";
    std::cout << (gen() % 100) << '\n';
    return 0;
}

Udtrykkelig geninitialisering

Du kan nulstille en eksisterende generator med seed(value) for at genstarte dens sekvens fra et kendt punkt.

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(1);
    unsigned first = gen();
    gen.seed(1);             // restart
    std::cout << std::boolalpha << (gen() == first) << '\n';
    return 0;
}

Lagring og gendannelse af tilstand

En generator kan skrives til en strøm og læses ind igen, så du kan gemme og genoptage en nøjagtig tilfældighedstilstand.

#include <iostream>
#include <sstream>
#include <random>

int main() {
    std::mt19937 gen(5);
    std::ostringstream save; save << gen;
    unsigned expected = gen();
    std::istringstream load(save.str());
    std::mt19937 restored; load >> restored;
    std::cout << std::boolalpha << (restored() == expected) << '\n';
    return 0;
}

random_device kan ikke genskabe samme forløb

Da random_device er ikke-deterministisk, må du aldrig bruge den, når du har brug for at genskabe en kørsel. Brug i stedet en fast startværdi.

#include <iostream>
#include <random>

int main() {
    const unsigned FIXED = 2026;
    std::mt19937 gen(FIXED); // reproducible across runs
    std::cout << (gen() % 10000) << '\n';
    return 0;
}

En genanvendelig generator

Et almindeligt mønster er at indkapsle en initialiseret generator i en lille hjælper, så resten af koden blot kan bede om tal.

#include <iostream>
#include <random>

int roll(std::mt19937& gen) {
    std::uniform_int_distribution<int> d(1, 6);
    return d(gen);
}

int main() {
    std::mt19937 gen(2026);
    std::cout << roll(gen) << ' ' << roll(gen) << '\n';
    return 0;
}

Hurtig kontrol

Afprøv din forståelse af initialisering.

Opsummering

Du har lært korrekt initialisering:

  • en fast startværdi giver reproducerbare kørsler, mens std::random_device giver unikke kørsler
  • initialisér én gang ved opstart, ikke før hver udtrækning; undgå den grovkornede time()-startværdi
  • seed_seq fordeler entropien over generatoren, og generatorens tilstand kan gemmes og gendannes via strømme

Dernæst anvender du alt dette på praktiske eksempler.

Gratis at komme i gang

Lær C++ med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
51
Lektioner
203

Ofte stillede spørgsmål

Er lektionen “Korrekt initialisering” gratis?

Ja — alle 3 lektioner i læringssporet C++ Academy, inklusive “Korrekt initialisering”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. C++ Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Korrekt initialisering”?

Opnå reproducerbar tilfældighed Du øver dig i C++ Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C++ Academy?

Der kræves ingen tidligere erfaring. C++ Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “Korrekt initialisering”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C++ Academy-lektion?

Ja. Alle C++ Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Tilfældighedsgeneratorer
  2. Fordelinger
  3. Korrekt initialisering
  4. Praktiske eksempler
← Tilbage til C++ Academy