2016-05-23 11 views
4

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++

+0

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? –

+0

Sie möchten vielleicht verweisen auf: http://StackOverflow.com/Questions/8120062/generate-random-64-Bit-integer – Bettorun

+2

"Sehr groß"? Ein einfacher 'std :: uint64_t' kann all diese Werte enthalten. –

Antwort

9

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; 
} 

Live Demo

+1

Habe noch nie das Wort 'API' gesehen, das dafür verwendet wird. –

+0

@GillBates, bearbeitet – coyotte508

+0

Diese Lösung erzeugt nur große Zahlen. Was, wenn ich die Zahlen im Bereich von 0 - 2^64 erzeugen möchte? –

-3

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 63641362238467930051442695040888963407 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.

+3

Warum das XOR eigentlich? Und warum Abschnitte von 20 Bits? Würden Sie bitte auf diese magischen Zahlen eingehen? –

+2

Könnten Sie bitte die Logik hinter der Return-Anweisung erklären? –

+0

32768 ist nur 2^15, also werden diese Verschiebungen um 20 nicht alle Bits füllen. – interjay

5

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.

1

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.

1

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.

Verwandte Themen