无法为整数生成全范围的随机

Can't Generate Full Range of Random for Integers

本文关键字:全范围 随机 成全 整数      更新时间:2023-10-16

我正在尝试生成一个0到100,000之间的10000个整数的文件,以便我可以稍后对它们进行合并排序。

当我使用fstream生成文件时,我从来没有得到一个超过32760的整数。

下面的方法生成文件,然后将其读回并检查是否有大于32750的整数。我通常会得到32750到32760之间的3-5个整数。为什么会发生这种情况,我该如何解决它?这是一个种子问题还是随机函数的实际使用?

// sizeOfArray = 10000
void generateFile() {
    ofstream fout("unsorted.txt");
    srand(time(NULL));
    // Generating the file
    int num;
    for(int i = 0; i < sizeOfArray; i++) {
         num = rand() % 100000;
         if(i < sizeOfArray-1)
            //fout << i+1 << ": " << num << endl;
            fout << num << endl;
         else
            //fout << i+1 << ": " << num;
            fout << num;
    }
    // Reading the File Back
    ifstream fin("unsorted.txt");
    for(int i = 0; i < sizeOfArray; i++) {
        fin >> num;
        if(num > 32750)
            cout << num << endl;
    }
    cin.get();
}


使用下面提供的答案,我生成了500次文件
我收到的最高整数是99931

您可以从rand()获得的最高随机值是RAND_MAX,一个库相关常数。在您的情况下,它似乎被设置为2^15-1,这是适合于有符号16位整数的最大正数。

当需要生成大于RAND_MAX的数字时,多次调用rand(),每次乘以RAND_MAX。例如,在您的情况下,下面的代码应该工作(我假设您的int有32位):

num = rand();
num *= RAND_MAX;
num += rand();
num %= 100000;

请注意,仅仅将三个随机数加在一起以获得所需的范围将不会产生与乘法和加法方法相同的随机分布。

您可以使用c++ 11中引入的新随机数生成器之一来获得更大的范围:http://en.cppreference.com/w/cpp/numeric/random

如果你没有c++ 11,你也可以从Boost: http://www.boost.org/doc/libs/1_53_0/doc/html/boost_random.html

取决于您使用的是什么:http://www.cplusplus.com/reference/cstdlib/RAND_MAX/