Benutzer:Havaniceday/Zufallszahlen

aus Wikipedia, der freien Enzyklopädie

↑ C++

Hinweis: Du darfst diese Seite editieren!
Ja, wirklich. Es ist schön, wenn jemand vorbeikommt und Fehler oder Links korrigiert und diese Seite verbessert. Sollten deine Änderungen aber der innehabenden Person dieser Benutzerseite nicht gefallen, sei bitte nicht traurig oder verärgert, wenn sie rückgängig gemacht werden.
Wikipedia ist ein Wiki, sei mutig!


Ab C++ 11 wurde mit dem Header <random> die STL um Werkzeuge zum Generieren von Zufallszahlen erweitert. Die Werkzeuge zur Generierung bestehen eigentlich im Wesentlichen aus nur drei Teilen:

  • std::random_device
  • std::default_random_engine
  • std::uniform_int_distribution<>

Das std::random_device generiert unsigned int-Zufallszahlen, die vom System in einem Pool zur Verfügung gestellt werden. Wenn viele Zufallszahlen erzeugt werden müssen, kann es sein, das das System nicht mehr mit der Generierung hinterher kommt, dann wir die Programmausführung verlagsamt. Abhilfe schaffen die Random-Engines. Sie generieren fortlaufend pseudo-zufällige Zahlen. Mit ihnen kann man sehr schnell sehr viele Zufallszahlen erzeugen. Und dann gibt es noch das Interface zur Verteilung (distribution) der Zufallszahlen. Mit std::uniform_int_distribution werden alle Zahlen gleich häufig generiert.

Hier einige Beispiele:

#include <random>
int wuerfel()
{
    static std::random_device rd;  // returns uniformly distributed unsigned ints
    static std::uniform_int_distribution<> d(1, 6); // uniformly ditributed in range [1,6]
    return d(rd);
}
#include <random>
int wuerfel()
{
    // sets the seed to the engine from an unsigned int of the random_device
    static std::default_random_engine e( std::random_device{}() );
    
    static std::uniform_int_distribution d(1, 6);

    return d(e);
}
#include <random>
#include <algorithm>

template <typename Itr>
void shuffle_container( Itr begin, Itr end )
{
    static std::default_random_engine e( std::random_device{}() );
    std::shuffle( begin, end, e);
}