Warum ist (rand() % nichts) immer 0, das in C++?
Ich bin mit Mühe rand() in C++. rand() in der Regel gibt mir eine sehr große Zahl. Wenn ich versuche, mit der modulo-operator ( % ), um ihm eine Auswahl, es gibt immer 0 zurück, egal was passiert.
Seeding der Zufallszahlengenerator am Anfang des Programms wird nicht helfen, entweder.
Können Sie einige der Codes, die Sie verwenden?
Nicht rand() geben Sie eine Zahl zwischen 0 und 1, also multipliziert man es vor der Anwendung der modulo?
Nein. rand() in C/C++ gibt eine Zahl zwischen 0 und RAND_MAX, die ist garantiert mindestens 32767.
Dann sollten Sie wirklich keine Ratschläge erteilen. Nicht als ob ich Ihnen mein Rat an Reitsport Reiter.
Übrigens, vermeiden Sie die Verwendung
Nicht rand() geben Sie eine Zahl zwischen 0 und 1, also multipliziert man es vor der Anwendung der modulo?
Nein. rand() in C/C++ gibt eine Zahl zwischen 0 und RAND_MAX, die ist garantiert mindestens 32767.
Dann sollten Sie wirklich keine Ratschläge erteilen. Nicht als ob ich Ihnen mein Rat an Reitsport Reiter.
Übrigens, vermeiden Sie die Verwendung
%
zum generieren von Zufallszahlen in einem Bereich. c-faq.com/lib/randrange.htmlInformationsquelleAutor Zachary Hinchliffe | 2010-01-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der folgende code funktioniert einwandfrei bei mir (emitting eine zufällige Zahl zwischen 0 inklusive und 1000 ausgeschlossen, es ist jedes mal ausführen):
Sie wollen wahrscheinlich schalten Sie die Warnungen auf Ihrem compiler. Das ist die Art von Sache, die Sie bekommen können den compiler zu fangen.
InformationsquelleAutor Alex Martelli
Ich denke, das ist üblich, wenn die Zufallsgenerator-Algorithmus lässt sich ein bestimmtes Muster von bits als null. (Zum Beispiel, wenn das low-order bits null sind, die Anzahl mod einige niedrige Konstante immer gleich null ist.)
Vielleicht sollten Sie versuchen, so etwas wie:
Beispielsweise in diese manpage link, es sagt:
Bitte nicht blind empfehlen, die high-order bits. Dies ist ganz abhängig von der PRNG verwendet. Numerische Rezepte ist ein schönes Buch, aber vor allem die älteren Editionen sind voller gefährlicher Rat. Dies ist einer jener Fälle. Außerdem, selbst diejenigen, die C/C++ - Implementierungen, die über ein LCG - wegwerfen, die low-order bits. Menschen, die gelernt haben, seit den 70er Jahren.
wenn N 1 ist, dann hätte ich kein problem mit 😉
Nun, in diesem Fall Sie brauchen nicht wirklich ein RNG, es gibt einfach nicht so viele Wahl in zahlen zwischen 1 und N, wenn N==1 😉
gut, es gibt multiples von N, so ist 1 eigentlich das beste Sie können es bekommen 🙂
InformationsquelleAutor asveikau
Scheint es, dass Ihre unmittelbare problem behandelt wurde, aber ich denke es ist noch erwähnenswert, ein weiterer Punkt. Mit dem Rest zum Klemmen Ausgänge vom rand zu einem angegebenen Bereich werden in der Regel verursachen Verzerrungen in den Ergebnissen. Um genau zu sein, wenn der Bereich des Generators (RAND_MAX im Fall von C oder C++) nicht ein Vielfaches der Reichweite du bist zu spannen, einige Ausgänge werden häufiger auftreten als andere. Für den Vergleich, sollten Sie versuchen, zu teilen 11 Bonbons gleichmäßig zwischen 3 Kindern (ohne zu brechen, in Stücke zerbrechen). Der einzige Weg, die Sie tun können es ist NICHT die hand aus, einige der Süßigkeiten. Ebenfalls mit einem random number generator, die einzige Möglichkeit, um eine gleichmäßige Verteilung in Ihrem Ausgang nicht verwenden, einige der Eingänge.
Als asveikau darauf hingewiesen in seinem post, dass Sie in der Regel verwenden die oberen bits von einem typischen linear congruential generator. Die unteren bits sind im Allgemeinen berechenbarer. Durch Division statt ein Rest, dies behält die oberen bits. Aber diese hat eine while-Schleife führt oft nur einmal, und selten mehr als zwei mal, so dass Ihre Auswirkungen auf die Leistung ist sehr gering.
Ob sich dies lohnt, hängt von der Verwendung, die Sie machen, von den zahlen, die Sie generieren-wenn Sie möchten, Würfel oder Karten für ein Spiel, dass Ihre Kinder ein paar mal spielen, mit einem Rest in der Regel nicht Schaden, ein Ding. Wenn Sie versuchen, zu tun, irgendeine Art von Monte-Carlo-simulation (zum Beispiel), möchten Sie wahrscheinlich ein bisschen vorsichtiger sein, obwohl...
java.util.Random.nextInt(int)
hat auch eine sehr interessante Umsetzung eine unvoreingenommene Wahl einer Zufallszahl zwischen 0 und n. Die high-order bits ... siehe mein Kommentar auf asveikau Antwort. Ich wirklich habe nicht gesehen, eine libc in eine Weile, gab die echte low-order bits des Status word. Und es gibt Generatoren, die schwache high-order bits. C nicht garantieren Ihnen einen LCG fürrand()
.garantiert nicht viel von etwas über rand() -- in der Tat, zu einer Zeit, es hatte einen wirklich schlechten generator als ein Beispiel, und die Worte, die offenbar davon überzeugt, dass zumindest ein paar der Entwickler, die einen besseren generator war nicht erlaubt. Dennoch, lower-order bits, die schlechter als die bits höherer Ordnung ist, genügend verbreitet, dass die höherwertigen bits ist eine gute Faustregel. Während einige Implementationen von rand() zu werfen, einige unteren bits, 1) es ist oft nicht ausreicht, und 2) ein paar noch nicht.
Und ein paar Generatoren haben ein schwaches high-order bits. Wo die Ergebnisse schlechter sein wird als das, was Sie begann mit. Die besten Tipps für C würde wahrscheinlich zu vermeiden, den eingebauten RNG vollständig, da es nicht überall angegeben und man konnte sich etwas von GUT zu RANDU. Dennoch, eine Menge Leute nicht verstehen, etwas über Zufallszahlen und Verallgemeinerungen der "Niemals diese" Art schädlich sind, in diesen Fällen. Im Allgemeinen Einmischung mit Generatoren ohne eine Ahnung nur, macht die Sache schlimmer, nicht besser.
InformationsquelleAutor Jerry Coffin