Korrekt initialisering
Opnå reproducerbar tilfældighed
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_devicegiver unikke kørsler - initialisér én gang ved opstart, ikke før hver udtrækning; undgå den grovkornede
time()-startværdi seed_seqfordeler entropien over generatoren, og generatorens tilstand kan gemmes og gendannes via strømme
Dernæst anvender du alt dette på praktiske eksempler.
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
- Tilfældighedsgeneratorer
- Fordelinger
- Korrekt initialisering
- Praktiske eksempler