3

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

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

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

// 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。

4

3 回答 3

7

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

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

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

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

于 2013-04-09T18:01:19.297 回答
3

您可以使用 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

于 2013-04-09T18:06:21.513 回答
2

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

于 2013-04-09T18:01:25.230 回答