在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岁。 奇怪的是,如果我尝试以下任何一项,它的工作完全正常:
我的编译器是mingw32-g ++。exe(TDM-2 mingw32)4.4.1。
这让我很困惑,有人能告诉我发生了什么吗?
答案 0 :(得分:3)
这是预期的:
rand()
函数返回0到RAND_MAX
范围内的伪随机整数(即数学范围[0,RAND_MAX
])。
所以rand() / RAND_MAX
可以为1,因为范围是包含的。您RAND_MAX + 1
的修正通常是选项。
话虽如此,有更好的选择可以在一个范围内生成随机数,从而产生均匀分布。