Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

rand() %4000000000UL giving only small values

Tags:

c++

random

srand

I have a question about the following code :

#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

On codepad.org it outputs large values like

378332591
1798482639
294846778
1727237195
62560192
1257661042

But on Windows 7 64bits, it outputs only small values (tested compiling on VS11 & Code::Blocks)

10989
13493
13169
18581
17972
29

Thanks in advance for helping a c++ learner ;)

like image 279
Jane Doe Avatar asked Apr 09 '12 14:04

Jane Doe


2 Answers

rand() generates only numbers up to its RAND_MAX.

According to MSDN, on Windows RAND_MAX is just 32767, or (2**15 - 1) (note that this is the minimal allowed RAND_MAX according to C standard (here link to open group base spec, which is based on C standard)).

If you want bigger numbers, you need to call it more times and bitshift, e.g.:

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

(example on codepad).

like image 110
liori Avatar answered Sep 19 '22 01:09

liori


The behavior you're encountering is due to the values of RAND_MAX on the two systems you're testing on.

On the windows 7 system, RAND_MAX is 32767, a value significantly smaller than whatever environment codepad runs your code in. Because of this, the randomly generated values are in a significantly smaller range.

like image 36
Sam DeHaan Avatar answered Sep 20 '22 01:09

Sam DeHaan