2015-04-21 5 views
5

Es ist in C++ legal ist zu schreiben:Verwendet std :: time mit std :: srand gültigen code?

std::srand(std::time(nullptr)); 

oder tut dies nicht definiertes Verhalten Ausbeute?


std::time liefert einen std::time_t die eine arithmetisch-Typ ist, aber anders als das nicht näher bezeichnet. Aus meiner Sicht ist der arithmetische Typ irgendeines der Gleitkomma-, Integer- und Zeichentypen.

std::srand nimmt eine unsigned int als Startwert.

Daher würde ich denken, dass Sie nicht unbedingt diese Konvertierung durchführen kann. las ich, dass auf Systeme POSIX konforme dass std::time_t Integral ist und die Anzahl der Sekunden seit dem 00.00, 1. Januar 1970 UTC. In diesem Fall kann die Umwandlung entsteht aus unterzeichnet unsigned Umwandlung, die eine Implementierung definierte Umwandlung ist aber sollte in Ordnung sein, und von einem größeren integral zu einem kleineren integralen Typ, der auch für das Saatgut in Ordnung ist.

+0

Ein arithmetischer Typ kann unter Verwendung einer oder mehrerer der Standardkonvertierungsregeln in ein "unsigned int" konvertiert werden. –

+0

Anbetracht dessen, dass 'rand' im Prozess zugunsten der wird von dem neuen' ' Header veraltet ist, würde ich keinen Schlaf über diese nicht verlieren. –

Antwort

4

Sie sind korrekt, time_t kann ein Fließkommatyp sein, und wenn das Ergebnis des Abschneidens des Werts nicht als unsigned int dargestellt werden kann, ist das Verhalten nicht definiert ([conv.fpint]/1).

Wenn Sie Zufallszahl in einer Standard-konformen Art und Weise erzeugen wollen, schlage ich vor, die ++ 11 <random> Einrichtungen C. Sie können die RNGs von std::random_device starten. Siehe z. B.https://stackoverflow.com/a/19666713/481267

Verwandte Themen