2012-04-09 72 views
6

我對下面的代碼問題:蘭特()%4000000000UL只給小值

#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 

在codepad.org它輸出像

378332591 
1798482639 
294846778 
1727237195 
62560192 
1257661042 

但在Windows 7 64位大的值,它只輸出小的值(測試了VS11編譯&代碼::塊)在進階

10989 
13493 
13169 
18581 
17972 
29 

由於ance幫助C++學習者;)

回答

9

rand()只產生數字,直到它的RAND_MAX。根據MSDN,在Windows上RAND_MAX只是32767或(2 ** 15-1)(注意這是根據C標準(這裏是基於C標準的link to open group base spec)允許的最小允許RAND_MAX))。

如果你想要更大的數字,你需要調用它更多的時間和位位移,例如:

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

example on codepad)。

5

您遇到的行爲是由於您正在測試的兩個系統上的RAND_MAX的值所致。

windows 7 systemRAND_MAX是32767,比任何環境鍵盤運行在代碼顯著小的值。因爲此,隨機生成的值在顯著較小的範圍內。

4

Windows使用一個最大值爲32767的隨機數生成器。請參閱RAND_MAX的值。

通過粘貼兩個rand()調用的輸出,可以創建一個更大的隨機數。

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

你也可以切換到不同的隨機數發生器,如Boost.RandomC++11

2

蘭特的結果是實現相關的,並保證只高達32767:

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

所以,當你與不同的庫實現不同系統上運行的代碼,你可以得到不同的結果 - Windows只能返回高達32767的數字,所以你可以從你的代碼中獲得小數字。