Warum gibt die C++-Funktion stdlib rand() plattformübergreifend unterschiedliche Werte für denselben Startwert an?

Lesezeit: 4 Minuten

Benutzer-Avatar
Einherji

Ich verstehe, dass die rand() Funktion generiert Pseudozufallszahlen basierend auf dem gegebenen Startwert, und dass sie auf einer bestimmten Plattform immer dieselbe Zahlenfolge aus demselben Startwert generiert, was ich wissen möchte, ist, warum sie auf allen verwendeten Plattformen eine andere Sequenz ergibt dieselbe Bibliothek? Dh wie ist rand() umgesetzt?

  • Denn die Angabe von rand diktiert nicht die von der Sequenz erzeugten Werte. Verwenden wenn Sie Garantien über die Sequenzen wollen.

    – R.Martinho Fernandes

    27. Februar 2013 um 10:15 Uhr

  • Der Standard spezifiziert nicht die Folge oder wie die Pseudozufallszahlenfolge erzeugt wird. Hinsichtlich dieser beiden Aspekte gibt es also keine Einschränkung hinsichtlich der Implementierung oder des plattformübergreifenden Verhaltens. C++11 fügt hinzu Zufallszahlengeneratoren mit mehr Spezifikationen.

    – Juanchopanza

    27. Februar 2013 um 10:16 Uhr


  • Ok, ich habe den Standard überprüft und festgestellt, dass bezüglich der Reihenfolge nichts festgelegt ist, also von welchen Faktoren hängt die Implementierung ab? Ist es dem Betriebssystem überlassen?

    – Einherji

    27. Februar 2013 um 10:19 Uhr


  • Eigentlich hängt das allein von der ab libc Gebraucht.

    – Filmer

    27. Februar 2013 um 10:21 Uhr

  • @R.MartinhoFernandes: Ich hätte erwartet, dies in einer Antwort zu finden.

    – PlasmaHH

    27. Februar 2013 um 11:40 Uhr

Benutzer-Avatar
NiereChris

Der C++-Standard gibt nicht an, welcher Algorithmus für die rand()-Funktion verwendet wird.

Die Funktionalität wird von demjenigen definiert, der die Standardbibliothek auf Ihrem System geschrieben hat: Microsoft für die in Visual Studio enthaltene Standardbibliothek und die GNU-Jungs für die mit GCC gelieferte Standardbibliothek.

Ihr Compiler trifft die Wahl, woher er seine Bibliothek bezieht, sodass Sie möglicherweise verschiedene Versionen der Standardbibliothek für verschiedene Compiler auf demselben System haben. Der Punkt bleibt derselbe: Die Spezifikation garantiert, welche Funktionen verfügbar sind und was sie tun; nicht, wie sie es tun.

  • Bedeutet das, dass das Ausführen des GNU-Compilers unter Windows zu derselben Sequenz führt?

    – Omar Kooheji

    27. Februar 2013 um 13:44 Uhr

  • @OmarKooheji Ich habe eigentlich nie versucht, GCC unter Windows zu installieren. Ich glaube, dass GCC, wenn es installiert ist, mit einer eigenen Kopie der Standardbibliothek geliefert wird (vermutlich vorkompiliert). Ich weiß das jedoch nicht genau – jemand mit Zugriff auf einen Windows-PC, auf dem er Sachen installieren kann, sollte meine Antwort gerne aktualisieren, wenn sie wahr ist.

    – NiereChris

    27. Februar 2013 um 14:32 Uhr


  • @OmarKooheji Ich war neugierig, also habe ich nachgeforscht. Meine Antwort wurde aktualisiert, um etwas genauer zu sein (für Leute, die versuchen, dem Kommentarthread in Zukunft zu folgen: Ich habe die Bibliothek ursprünglich eher dem Betriebssystem als Ihrer Entwicklungsumgebung zugeschrieben).

    – NiereChris

    27. Februar 2013 um 15:08 Uhr

Benutzer-Avatar
daramarak

Die rand()-Funktion berechnet eine Folge pseudozufälliger Ganzzahlen im Bereich [0, {RAND_MAX}] mit einer Periode von mindestens 2^32.

Die Funktion rand_r() berechnet eine Folge pseudozufälliger Ganzzahlen im Bereich [0, {RAND_MAX}]. (Der Wert des Makros {RAND_MAX} muss mindestens 32767 sein.)

Wenn rand_r() mit demselben Anfangswert für das Objekt aufgerufen wird, auf das Seed zeigt, und dieses Objekt zwischen aufeinanderfolgenden Rückgaben und Aufrufen von rand_r() nicht modifiziert wird, soll dieselbe Sequenz generiert werden.

Die Funktion srand() verwendet das Argument als Ausgangspunkt für eine neue Folge von Pseudozufallszahlen, die von nachfolgenden Aufrufen von rand() zurückgegeben werden. Wenn dann srand() mit demselben Startwert aufgerufen wird, soll die Folge von Pseudo-Zufallszahlen wiederholt werden. Wenn rand() aufgerufen wird, bevor srand() aufgerufen wird, wird dieselbe Sequenz generiert wie beim ersten Aufruf von srand() mit einem Startwert von 1.

Die Funktion rand() soll die nächste Pseudozufallszahl in der Folge zurückgeben.

Dies sagt der IEEE Std 1003.1 C-Standard darüber aus, wie die rand() Funktion sollte sich verhalten. Es sagt nichts darüber aus, wie die Sequenz berechnet werden soll. Mit anderen Worten, es steht jedem Implementierer frei, seine eigene Version eines Pseudozufallssequenzgenerators zu wählen.

Ihre Beobachtungen zeigen, dass sie diese Freiheit ausgenutzt haben.

Darauf könnte ich auch hinweisen rand() ist ein Teil der <cstdlib> die mehr oder weniger eine Kopie der C-Standardbibliothek ist, und die neue Bibliothek bietet Ihnen mehr Flexibilität und Standard-Sequenzgeneratoren, wenn Sie einen ausreichend neuen C++-Compiler haben und nicht von C-C++-Interoperabilität abhängig sind.

  • rand ist ebenfalls Teil der C++-Bibliothek, obwohl einige Teile des Standards in Bezug auf den C-Standard definiert sind.

    – Sebastian Mach

    27. Februar 2013 um 10:27 Uhr

  • @phresnel, stimmt, es kam so rüber, als wäre es kein Teil von c++. Ich habe meine Antwort bearbeitet, um wiederzugeben, was ich meinte.

    – Daramarak

    27. Februar 2013 um 10:35 Uhr

1204160cookie-checkWarum gibt die C++-Funktion stdlib rand() plattformübergreifend unterschiedliche Werte für denselben Startwert an?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy