c ++ rand()奇怪的行为

时间:2013-09-03 09:44:29

标签: c++ random

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

这让我很困惑,有人能告诉我发生了什么吗?

1 个答案:

答案 0 :(得分:3)

这是预期的:

  

rand()函数返回0到RAND_MAX范围内的伪随机整数(即数学范围[0,RAND_MAX])。

     

- man rand(3)

所以rand() / RAND_MAX 可以为1,因为范围是包含的。您RAND_MAX + 1的修正通常是选项。

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