gpt4 book ai didi

C++ rand() 奇怪的行为

转载 作者:行者123 更新时间:2023-11-30 02:52:46 26 4
gpt4 key购买 nike

我在 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 的值是随机的 watch 。
  • 我添加了 sdt:cout 之类的代码,如我在代码注释中所示。
  • 我使用 (RAND_MAX + 1.0) 而不是 (RAND_MAX)。

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

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

最佳答案

这是意料之中的:

The rand() function returns a pseudo-random integer in the range 0 to RAND_MAX inclusive (i.e., the mathematical range [0, RAND_MAX]).

man rand(3)

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

话虽这么说,但有更好的选择可以在产生均匀分布的范围内生成随机数。

关于C++ rand() 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18589012/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com