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

3
我正在尝试生成一个包含1万个0到100000之间整数的文件,以便稍后对它们进行归并排序。
使用fstream生成文件时,我从未得到超过32760的整数。
以下方法生成文件,然后读取它并检查是否有任何超过32750的整数。通常会得到3-5个介于32750和32760之间的整数。为什么会发生这种情况,如何解决?这是种子问题还是随机函数的实际使用问题?
// 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.


1
这是随机数生成器的范围。可以使用另一个随机数生成器,或者取两个随机数并将它们合并成一个。 - Mark Ransom
2
根据cplusplus.com的说法,rand()函数的范围为0 - RAND_MAXRAND_MAX取决于库,但至少应该是32767 - OGH
1
你知道有没有一个随机数生成器可以给我所需的范围吗? - Gander7
1
这实际上是一个很好的问题 - 在当今这个时代,随机数的范围不应该如此之小并不明显。你遇到的限制在20年前可能更为合适。 - Mark Ransom
4
加上三个随机数不会给你一个均匀分布。这是为什么掷两个骰子更可能得到7而不是2的原因。 - Mark Ransom
显示剩余2条评论
3个回答

7
rand()函数返回的最大随机值是取决于库的常量RAND_MAX。在您的情况下,它似乎被设置为2^15-1,即适合有符号16位整数的最大正数。

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

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

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

1
为什么包括行num += rand()?我尝试过没有这行,但仍然得到非常接近100000的整数。 - Gander7
1
@Gander7:如果你不执行num += rand(),那么你的结果(在取模之前)总是会是RAND_MAX的倍数。你也可以这样想:如果RAND_MAX是2的幂次方,那么它相当于分别进行左移和按位或运算来设置位的各个部分。 - jamesdlin
1
啊,即使rand()已经被使用过一次,如果没有那行代码,我仍然只能获得32767个数字。它们将是原始的32767 * RAND_MAX。第二个Rand()是为了使结果多样化。@jamesdlin 谢谢。 - Gander7
@Gander7 想象一下一个返回0到99的值的 rand()。假设你需要一个0到9999的数字。正确的方法是 rand()*100+rand():第一个 rand() 填充前两位数字,第二个填充后两位数字。你可以只使用 rand()*100,但这样你永远不会得到从0到99、从100到199、从200到299等范围内的数字。 - Sergey Kalinichenko
顺便说一句,我不喜欢使用“%100000”来获取[0, 100000)范围内的随机数,因为它会引入偏差,并且由于http://www.c-faq.com/lib/notveryrand.html。 - jamesdlin
@jamesdlin 我同意。然而,为了生成测试排序算法所需的文件,这个足以。 - Sergey Kalinichenko

3

rand()是一个无望的情况,请转而使用以下其中之一。 - CodesInChaos

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接