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

Gan*_*er7 3 c++ random file-io ifstream

我试图生成一个介于0和100 000之间的10000个整数的文件,所以我可以在以后对它们进行MergeSort.

当我使用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();
}
Run Code Online (Sandbox Code Playgroud)

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

das*_*ght 7

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

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

num = rand();
num *= RAND_MAX;
num += rand();
num %= 100000;
Run Code Online (Sandbox Code Playgroud)

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