1

在 c++ 中使用 rand() 时,我看到一个非常奇怪的行为。这是我的代码。

#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <limits.h>

#define N 10
int main() {
    srand(time(NULL));

    while(true) {
        int i = N * ((double) rand() / (RAND_MAX));
        //std::cout << i << std::endl;  // If there is any code here, everything goes fine.
        if (i == N) {
            std::cout << "i " << i << " should never happen" << std::endl;
        } else {  
            std::cout << ".";
        }
    }
}

这是输出:

i 10 should never happen
i 10 should never happen
i 10 should never happen
...

这对我来说真的没有意义,因为我认为我永远不会是 10 岁。奇怪的是,如果我尝试以下任何一种方法,它会完全正常:

  • 我使用调试器和单步跟踪代码,i 的值在手表中是随机的。
  • 我添加了 sdt:cout 之类的代码,如代码注释中所示。
  • 我使用 (RAND_MAX + 1.0) 而不是 (RAND_MAX)。

我的编译器是 mingw32-g++.exe (TDM-2 mingw32) 4.4.1。

这真的让我很困惑,谁能告诉我这是怎么回事?

4

1 回答 1

3

这是可以预料的:

rand()函数返回一个伪随机整数,范围为 0 到RAND_MAX包括 0 (即数学范围 [0, RAND_MAX])。

—<a href="http://linux.die.net/man/3/rand" rel="nofollow noreferrer">man rand(3)

所以rand() / RAND_MAX 可以是 1,因为范围包括在内。您的修复RAND_MAX + 1通常是采用的选项。

话虽如此,有更好的选择可以在一定范围内生成随机数,从而产生均匀分布。

于 2013-09-03T09:46:13.023 回答