2012-04-09 4 views
6

Ich habe eine Frage zu folgendem Code:rand() geben% 4000000000UL nur kleine Werte

#include <iostream> 
#include <ctime> 

int main(){ 
    unsigned long int blob; 
    srand(time(0)); 

    for(int counter = 0; counter <= 100; counter++) { 
     blob = rand() % 4000000000UL ; 
     std::cout << blob << std::endl; 
    }//for 
    system("pause"); 
    return 0; 
} //main 

Auf ihm codepad.org gibt große Werte wie

378332591 
1798482639 
294846778 
1727237195 
62560192 
1257661042 

Aber auf Windows 7 64-Bit, es gibt nur kleine Werte (getestet auf VS11 Kompilieren & Code :: Blocks)

10989 
13493 
13169 
18581 
17972 
29 

Vielen Dank im adv Hilfe für einen C++ Lerner;)

Antwort

9

rand() generiert nur Zahlen bis zu seinem RAND_MAX.

Nach MSDN, auf Windows RAND_MAX ist nur 32767 oder (2 ** 15-1) (beachten Sie, dass dies die minimal zulässige RAND_MAX ist nach C-Standard (hier link to open group base spec, die auf C-Standard basieren)).

Wenn Sie größere Zahlen wollen, müssen Sie es mehrmals und bitshift nennen, z.B .:

long long int my_big_random = rand()^(rand() << 15)^((long long int) rand() << 30); 

(example on codepad).

5

Das Verhalten, auf das Sie stoßen, ist auf die Werte von RAND_MAX auf den beiden Systemen zurückzuführen, auf denen Sie testen.

Auf der windows 7 system, RAND_MAX ist 32767, ein Wert deutlich kleiner als jede Umgebung Codepage führt Ihren Code in. Aus diesem Grund sind die zufällig generierten Werte in einem deutlich kleineren Bereich.

4

Windows verwendet einen Zufallszahlengenerator mit einem maximalen Wert von 32767. Siehe den Wert für RAND_MAX.

Sie können eine größere Zufallszahl erstellen, indem Sie die Ausgabe von zwei rand() -Aufrufen einfügen.

big_rand = rand() << 15 | rand(); 

Sie auch auf einen anderen Zufallszahlengenerator wie Boost.Random oder C++11 wechseln könnten.

2

die Ergebnisse der rand sind abhängig von der Implementierung und garantiert nur so hoch wie 32767:

http://en.cppreference.com/w/cpp/numeric/random/RAND_MAX

Also, wenn Sie Ihren Code auf unterschiedlichen Systemen mit unterschiedlichen Bibliothek Implementierungen laufen, können Sie verschiedene ergebnis- bekommen Windows gibt nur Zahlen bis zu 32767 zurück, daher erhalten Sie kleine Zahlen aus Ihrem Code.

Verwandte Themen