0Pricing
C++ Academy · Lektion

Zufallszahlengeneratoren

Zufallsbits erzeugen

Zufallszahlengeneratoren ist eine kostenlose C++ Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C++ Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.

Warum <random>?

Das alte rand() ist von geringer Qualität und schwer zu kontrollieren. Die Bibliothek <random> trennt die Zufälligkeit in Engines (Quellen für Zufallsbits) und Verteilungen (Form der Ausgabe).

#include <iostream>
#include <random>

int main() {
    std::mt19937 engine(42);
    std::cout << "engine produced a value\n";
    unsigned int v = engine();
    std::cout << (v != 0 ? "non-zero" : "zero") << '\n';
    return 0;
}

Der Mersenne-Twister

std::mt19937 ist die am häufigsten verwendete Engine: schnell, hochwertig und mit einer langen Periode. Die Zahl gibt ihre Zustandsgröße in Bits an.

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(1);
    unsigned int a = gen();
    unsigned int b = gen();
    std::cout << (a != b ? "two different values" : "same") << '\n';
    return 0;
}

Engines sind deterministisch

Bei demselben Seed erzeugt eine Engine immer dieselbe Sequenz. Dadurch werden Ergebnisse reproduzierbar.

#include <iostream>
#include <random>

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

Die Engine aufrufen

Eine Engine ist aufrufbar. Jeder Aufruf von engine() gibt die nächste rohe Zufallszahl in ihrem Wertebereich zurück.

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(7);
    for (int i = 0; i < 3; ++i) {
        unsigned int v = gen();
        std::cout << (v % 100) << ' ';
    }
    std::cout << '\n';
    return 0;
}

Der Wertebereich einer Engine

min() und max() geben den Bereich der Rohwerte an, die eine Engine ausgeben kann.

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen;
    std::cout << "min: " << gen.min() << '\n';
    std::cout << "max: " << gen.max() << '\n';
    return 0;
}

Weitere Engines

Die Bibliothek bietet mehrere Engines:

  • minstd_rand: kleiner linearer Kongruenzgenerator.
  • mt19937: allgemeine Standard-Engine.
  • ranlux48: höhere Qualität, aber langsamer.
#include <iostream>
#include <random>

int main() {
    std::minstd_rand lcg(5);
    std::mt19937 mt(5);
    std::cout << (lcg() % 10) << ' ' << (mt() % 10) << '\n';
    return 0;
}

64-Bit-Engine

Verwenden Sie std::mt19937_64, wenn Sie 64-Bit-Zufallswerte benötigen, beispielsweise für große Hashes oder sehr große Wertebereiche.

#include <iostream>
#include <random>

int main() {
    std::mt19937_64 gen(99);
    unsigned long long v = gen();
    std::cout << "got a 64-bit value: " << (v != 0 ? "yes" : "no") << '\n';
    return 0;
}

Engine und Verteilung

Die rohe Ausgabe der Engine ist über einen sehr großen Wertebereich gleichverteilt. Um brauchbare Werte wie einen Würfelwurf zu erhalten, übergeben Sie die Engine an eine Verteilung.

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(2024);
    std::uniform_int_distribution<int> die(1, 6);
    std::cout << "rolled " << die(gen) << '\n';
    return 0;
}

Werte verwerfen

discard(n) bewegt die Engine um n Schritte weiter, ohne eine Ausgabe zu erzeugen. Das ist nützlich, um in einer Sequenz vorzuspringen.

#include <iostream>
#include <random>

int main() {
    std::mt19937 a(10), b(10);
    b.discard(2);
    a(); a();
    std::cout << std::boolalpha << (a() == b()) << '\n';
    return 0;
}

Eine Engine wiederverwenden

Erzeugen Sie eine einzige Engine und verwenden Sie sie für alle Zufallswerte in Ihrem Programm wieder. Jedes Mal eine neue Engine zu erzeugen, ist ineffizient und kann die Qualität beeinträchtigen.

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen(2026);
    std::uniform_int_distribution<int> d10(1, 10);
    int total = 0;
    for (int i = 0; i < 5; ++i) total += d10(gen);
    std::cout << "sum of 5 rolls: " << total << '\n';
    return 0;
}

Tückischer Standard-Seed

Eine per Standardkonstruktor erzeugte Engine verwendet einen festen Standard-Seed und erzeugt daher bei jedem Durchlauf dieselbe Sequenz. Für echte Vielfalt müssen Sie sie mit einem Seed initialisieren (das wird in der nächsten Lektion behandelt).

#include <iostream>
#include <random>

int main() {
    std::mt19937 gen; // default seed: same every run
    std::cout << "first value mod 1000: " << (gen() % 1000) << '\n';
    return 0;
}

Kurztest

Testen Sie Ihr Verständnis von Zufalls-Engines.

Zusammenfassung

Sie haben Zufalls-Engines kennengelernt:

  • <random> trennt Engines (Bits) von Verteilungen (Form)
  • std::mt19937 ist die gängige Engine und für einen bestimmten Seed deterministisch
  • Verwenden Sie eine Engine wieder und initialisieren Sie sie mit einem geeigneten Seed, um echte Vielfalt zu erhalten

Als Nächstes formen Sie die Ausgabe einer Engine mithilfe von Verteilungen.

Häufig gestellte Fragen

Ist die Lektion „Zufallszahlengeneratoren“ kostenlos?

Ja — der vollständige Text von „Zufallszahlengeneratoren“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C++ Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Zufallszahlengeneratoren“?

Zufallsbits erzeugen Du übst C++ Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C++ Academy zu starten?

Keine Vorkenntnisse erforderlich. C++ Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.

Wie lange dauert die Lektion „Zufallszahlengeneratoren“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C++ Academy-Lektion Code schreiben und ausführen?

Ja. Jede C++ Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Zufallszahlengeneratoren
  2. Verteilungen
  3. Richtig initialisieren
  4. Praktische Beispiele
← Zurück zu C++ Academy