Immer große Zufallszahlen in C/C++
Standard rand()
- Funktion gibt zahlen nicht groß genug für mich: ich brauche unsigned long long
lieben. Wie bekommen wir die wirklich großen Zufallszahlen? Ich habe versucht, ändern Sie eine einfache hash-Funktion, aber es ist zu großen, zu lange dauert zu laufen und führt nie zu zahlen, die weniger als 1e5!!
- Wie viel "GROßE" zahlen, die Sie wollen?
- Wie wäre es mit rand() zu bekommen Sätze von Zufalls-bits, und füllen jedes
int
-Breite Anzahl von bits in einer Zeit, in derunsigned long long
unter Verwendung von bit-Masken. - "nie zahlen, die kleiner sind, als 1e5" - wie haben Sie "nie"? Es wäre zu erwarten, dass der vollkommen zufällige zahlen würden nicht belegen, dass die Palette sehr oft, da die volle Bandbreite Sie für Fragen.
- wie wäre Notwasserung
rand()
und mit einigen der besser RNGs c++ bietet en.cppreference.com/w/cpp/numeric/random - SEHR groß, viel mehr als 1e7
- Haben Sie gesehen, stackoverflow.com/questions/8120062/...?
- Ich bin nur nicht sicher, ob diese zahlen passen in unsigned long long
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier eine tragbare Lösung, die C99 gibt eine zufällige 64-bit-Zahl:
Erklärung:
rand()
gibt ganze zahlen im Bereich von 0 bisRAND_MAX
undRAND_MAX
ist nur garantiert werden, zumindest als 32.767 (15 zufällige bits).long long
wird garantiert, um 64 bit, aber möglicherweise größer.r & 0xFFFFFFFFFFFFFFFFULL;
?, es scheint ein NOOPlong long
könnte größer sein als 64 bits sein. Wenn es 64 bit ist, sollte der compiler machen es einem noop.return rand() << 32 | rand();
ist genugRAND_MAX == INT_MAX
, würde dies nicht funktionieren, darand()
gibt nur 31 zufälligen bits.rand
fordert, nicht 5#define RAND_MAX 0x7fff
unsigned long long
Anzahl erzeugt werden könnenllrand
und ob einige numebrs sind mehr oder weniger wahrscheinlich. Davon ausgehen, dassrand() & 0x7FFF
ist gleichmäßig verteilt, die für die Zwecke dieses experiment.Können Sie ganz einfach tun dies mit
std::uniform_int_distribution<unsigned long long>
.Einfaches Beispiel-code (aus hier, so modifiziert, dass
unsigned long long
):Beachten Sie, dass das seeding des mersenne twister als hier für demo-Zwecke ist nicht perfekt, zum Beispiel hier.
Wenn Sie wollen, zu produzieren, unsigned long long Rückgabewert von rand() und kümmern sich nicht um die Merkmale der Ergebnis betrachten Sie die folgende Funktion werden müssen compiler-version und Plattform-unabhängig (da keine "magic numbers" verwendet werden):
Aber wenn Sie möchten, eine Sequenz von Zufallszahlen mit bestimmten Eigenschaften, sollten Sie sich in bestimmten Führern oder mathematische Bücher. E. g. https://www.gnu.org/software/gsl/manual/html_node/Random-number-generator-algorithms.html
Du nicht Fragen, für eine bestimmte OS und die Antworten hier sind wirklich gut, aber unter Linux (und wahrscheinlich auch auf anderen Betriebssystemen auch) kann man auch Lesen aus einer random-Gerät.
Beispiel:
Geschrieben auf mobile, können Fehler. 😛
Können Sie auch die boost-library (entnommen aus link):
versuchen Sie dies: