2012-04-09 13 views
6

Ho una domanda circa il codice seguente:rand()% 4000000000UL dare solo valori piccoli

#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 

Su codepad.org che emette valori grandi come

378332591 
1798482639 
294846778 
1727237195 
62560192 
1257661042 

Ma su Windows 7 64bit, emette solo i valori di piccole dimensioni (testati compilazione on VS11 & Code :: Blocks)

10989 
13493 
13169 
18581 
17972 
29 

Grazie in adv per aiutare un utente C++;)

risposta

9

rand() genera solo numeri fino al suo RAND_MAX.

Secondo MSDN, su Windows RAND_MAX è solo 32767, oppure (2 ** 15-1) (si noti che questo è il minimo consentito RAND_MAX in base al C standard (qui link to open group base spec, che si basa su standard C)).

Se si desidera che i numeri più grandi, è necessario chiamare più volte e Bitshift, ad es .:

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

(example on codepad).

5

Il comportamento che stai incontrando è dovuto ai valori della RAND_MAX sui due sistemi che stai test su.

Sul windows 7 system, RAND_MAX è 32767, un valore significativamente più piccolo di qualsiasi altro codificatore di ambiente esegua il codice. Per questo motivo, i valori generati casualmente si trovano in un intervallo significativamente più piccolo.

4

Windows utilizza un generatore di numeri casuali che ha un valore massimo di 32767. Vedere il valore per RAND_MAX.

È possibile creare un numero casuale più grande incollando l'output di due chiamate rand().

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

Si potrebbe anche passare a un diverso generatore di numeri casuali come Boost.Random o C++11.

2

i risultati di rand sono a carico di attuazione e garantiti per il solo essere alto come 32767:

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

Quindi, quando si esegue il codice su diversi sistemi con diverse implementazioni di libreria, è possibile ottenere risultati- diversi Windows restituisce solo numeri fino a 32767, quindi ottieni numeri piccoli dal tuo codice.