Ich möchte sehr große Zufallszahl im Bereich von 0 - 2^64 mit C++ zu erzeugen. Ich habe die Funktion rand() benutzt, aber es erzeugt keine sehr große Zahl. Kann jemand helfen?Wie generiert man sehr große Zufallszahl in C++
Antwort
Mit C++ 11, die Standard-random library of c++11 verwenden, können Sie dies tun:
#include <iostream>
#include <random>
int main()
{
/* Seed */
std::random_device rd;
/* Random number generator */
std::default_random_engine generator(rd());
/* Distribution on which to apply the generator */
std::uniform_int_distribution<long long unsigned> distribution(0,0xFFFFFFFFFFFFFFFF);
for (int i = 0; i < 10; i++) {
std::cout << distribution(generator) << std::endl;
}
return 0;
}
Habe noch nie das Wort 'API' gesehen, das dafür verwendet wird. –
@GillBates, bearbeitet – coyotte508
Diese Lösung erzeugt nur große Zahlen. Was, wenn ich die Zahlen im Bereich von 0 - 2^64 erzeugen möchte? –
Wenn Ihre rand()
Funktion nur Zahlen gibt im Bereich [0, 2^15)
, dann können Sie 5 Zahlen von rand()
zu bekommen eine Zahl im Bereich [0, 2^64)
zurück verketten.
Natürlich gibt es andere mögliche Lösungen (die vielleicht noch besser sind). Die rand()
-Funktion in C++ - Bibliothek ist normalerweise eine linear congruential generator. Sie können einfach Ihren eigenen Generator mit den gleichen mathematischen Prinzipien implementieren.
Zum Beispiel kann der folgende Code erzeugt 64-Bit-Zufallszahlen:
unsigned long long rand64()
{
static unsigned long long seed;
seed = seed * 6364136223846793005 + 1442695040888963407;
return seed;
}
Die Parameter 6364136223846793005
1442695040888963407
und sind diejenigen, die von Donald Knuth.
Die Vor- und Nachteile dieser Methode werden in der obigen Wiki-Seite diskutiert. Wenn keine Zufälligkeit hoher Qualität erforderlich ist, könnte dies eine gute Wahl sein.
Warum das XOR eigentlich? Und warum Abschnitte von 20 Bits? Würden Sie bitte auf diese magischen Zahlen eingehen? –
Könnten Sie bitte die Logik hinter der Return-Anweisung erklären? –
32768 ist nur 2^15, also werden diese Verschiebungen um 20 nicht alle Bits füllen. – interjay
Als einheitlich Zufallszahl im Bereich [0, 2^64)
ist nur 64 Zufallsbits, können Sie einfach verwenden, um die Rückgabewerte von std::mt19937_64
direkt:
#include <random>
int main() {
std::mt19937_64 gen (std::random_device{}());
std::uint64_t randomNumber = gen();
}
Beachten Sie, dass eine Mersenne-Twister-Motor Impfen mit ein einzelner 32-Bit-Seed ist nicht optimal, für einen besseren Weg, werfen Sie einen Blick auf this.
Beachten Sie auch, dass die Verwendung von rand
in diesen Tagen im Allgemeinen abgeraten wird. ist ein Vortrag von Stephan T. Lavavej zu diesem Thema.
Ich würde auch in Betracht ziehen, stattdessen die OS-Einrichtungen zu verwenden. Alle modernen Systeme haben kryptographische Module, die in der Lage sind, sehr gute beliebige Byte-Arrays beliebiger Länge zu erzeugen. Linux hat getrandom()
. Windows hat CryptGenRandom
. OpenBSD hat arc4random
. iOS hat SecRandomCopyBytes
. etc. etc.
I'wrote Funktion, die zufällige 19-stellige Zahl generiert Es funktioniert genau wie Standard-Rand() -Funktion. Er zeichnet jede Ziffer aus einer 19-stelligen Zahl und speichert sie in einem Array, um sie dann zu einer großen, großen Zufallszahl zusammenzufügen.
unsigned long long Randomize()
{
unsigned long long randnumber = 0;
int digits[20];
for (int i = 19; i >= 1; i--)
{
digits[i]=rand()%10:
}
for(int i=19; i>=1; i--)
{
unsigned long long power = pow(10, i-1);
if (power%2 != 0 && power != 1) //eliminates "bug" (which comes from long long power is not a float))
power++;
randnumber += power * digits[i];
}
return randnumber;
}
Um diese Funktion Sie einige Bibliotheken implementieren müssen verwenden
#include <stdlib.h>
#include <time.h>
#include <math.h>
Beispiel:
srand(time(NULL));
randomnumber = Randomize()%10000000+10000000;
in diesem Fall Zufallszahl ist eine Zahl von 10 Millionen bis 20000000.
- 1. Wie generiert man eine "große" Zufallszahl in Python?
- 2. Wie analysiert man sehr große XML-Dateien in C#?
- 3. Wie generiert man eine Zufallszahl in 8086 Assembly?
- 4. Wie generiert man eine Zufallszahl in einem Template Django Python?
- 5. Wie behandelt man sehr große Daten?
- 6. Wie generiert man eine Zufallszahl in Swift, ohne die vorherige Zufallszahl zu wiederholen?
- 7. Anzeige sehr große 1bpp Bitmap in C#
- 8. Wie generiert man eine Zufallszahl aus der angegebenen diskreten Verteilung?
- 9. Wie generiert man eine Zufallszahl von 0,5 bis 1,0
- 10. Sehr, sehr große Zahlen in vb.net
- 11. Sehr große Speicherauslastung in Benachrichtigungen
- 12. Echo eine sehr große Zahl
- 13. PhantomJS generiert große PDF
- 14. Problem Zufallszahl in C#
- 15. PyInstaller sehr große Dateigröße
- 16. Transaktionen über sehr sehr große Entitätsgruppe
- 17. Wie man eine sehr große Matrix mit Matlab erstellt
- 18. Wie vermeidet man sehr große Objekte mit Domain Driven Design
- 19. Multiplizieren sehr große Ganzzahl in .NET
- 20. Wie generiert man eine kryptografisch sichere Pseudozufallszahl in C?
- 21. Sehr große Zeichenfolge im Speicher
- 22. Datenbankentwurf für sehr große Datenmengen
- 23. HTTP Download sehr große Datei
- 24. Handle sehr große http Download
- 25. pread für sehr große Dateien
- 26. Wie generieren Sie eine Zufallszahl in C#?
- 27. Wie generiert man eine Zufallszahl zwischen a und b in Ruby?
- 28. Wie generiert man die Zufallszahl des angegebenen Dezimalpunkts zwischen 2 Zahlen in Python?
- 29. Binomialtest in Python für sehr große Zahlen
- 30. Warum generiert dieser Code sehr große ausführbare Datei in go (ca. 81M)?
Do willst du, dass diese Nummer selbst eine Nummer ist?Oder nur eine Zeichenfolge wie Hash? Oder bevorzugen Sie eine sehr lange Zahl als Saite? –
Sie möchten vielleicht verweisen auf: http://StackOverflow.com/Questions/8120062/generate-random-64-Bit-integer – Bettorun
"Sehr groß"? Ein einfacher 'std :: uint64_t' kann all diese Werte enthalten. –