auf einem anderen Ton, dieser Code:
rand()%6
wird allgemein als eine schlechte Praxis angesehen. die unteren Bits von rand() sind signifikant weniger zufällig als die höheren Bits. Sie erhalten eine bessere Zufälligkeit, wenn Sie folgendes tun:
(rand() >> 8)%6
zum Beispiel.
EDIT:
Weitere Einzelheiten hierzu finden Sie this note und auch dieser Artikel von Dr. Dobbs Zeitschrift, die zumindest Hinweis auf den Grund:
Hinweis: Verwenden Sie KEINE
y = rand() % M;
wie dies auf die unteren Bits von Rand() konzentriert. Für lineare Kongruenz zufällige Zahlengeneratoren, die rand() oft ist, sind die unteren Bytes viel weniger zufällig als die höheren Bytes. In der Tat das niedrigste Bit zwischen 0 und 1 Zyklen. So kann rand() zwischen geraden und ungerade (probieren Sie es aus). Anmerkung rand() muss nicht ein linearer kongruenter Zufallszahlengenerator sein. Es ist perfekt zulässig, damit es etwas besser ist, das dieses Problem nicht hat.
DDJ:
Der wichtigste Punkt ist, dass die unteren Bits der Ausgabe aus der üblichen (linearen Kongruenz) Zufallszahlengeneratoren die am wenigsten sind "random". Das heißt, Muster in den unteren Bits sind üblich. Daher ist die Ausgabe von der Routine in Ihrer Diskussion nicht überraschend. Außerdem ist es vermeidbar, indem man sich auf die oberen Bits bezieht, um die Ganzzahl zurückzugeben.
Zum Beispiel, wenn Sie wollten einen zufälligen „true“ oder „false“ Wert wählen, und Sie verwendete den Code:
rand() % 2
Dann könnten Sie das Muster der Ergebnisse am Ende sehen:
1,0,1,0,1,0,1,0,1,0 (etc)
Dies ist offensichtlich nicht so zufällig, aber es ist eine Eigenschaft des Kongruenzgenerator, der in sein könnte benutzen. Ein besseres Schema (für C++) könnte die Verwendung der Boost.Random-Bibliothek sein, die Unterstützung für alle Arten von steckbaren Zufallsgeneratoren bietet (einschließlich Mersenne Twister, die diesen Fehler nicht aufweist).
Sie sollten und , denke ich, in C++ Code verwenden. –
Warum das C-Tag für C++ entfernen? Die Frage bezieht sich auf srand() und time(), die aus der C-Sprache kommen. –