好吧,我开始失去理智了。我想做的就是随机一个 0 到 410 之间的数字,并根据 this页面,我的代码应该做到这一点。由于我想要一个随机数而不是伪随机数,因此我也使用 srand() ,例如this线程告诉我要做的。但这不起作用。我得到的只是一个数字,该数字取决于自上次执行以来的时间。如果我例如尽可能快地再次执行它,该数字通常比上一个数字高6个数字,如果我等待更长的时间,它会更高,等等。当它达到410时,它会回到0并重新开始。我错过了什么?
编辑:哦,如果我删除 srand(time(NULL));
行,我每次运行程序时都会得到相同的数字 (41)。这甚至不是伪随机的,这只是一个静态数字。只需复制 the article I linked to above 中的第一行代码仍然总是给我41号。我是《数字 23》续集中的明星,还是我错过了什么?
int main(void) {
srand(time(NULL));
int number = rand() % 410;
std::cout << number << std::endl;
system("pause");
}
最佳答案
这就是使用已弃用的随机数生成所得到的结果。
rand
产生一个固定的数字序列(这本身就很好),而且效果非常非常糟糕。
你告诉rand
通过srand
顺序中从哪里开始。由于您的“起点”(称为 seed 顺便说一句)取决于自 1.1.1970 0:00:00 UTC 以来的秒数,因此您的输出显然取决于时间。
做你想做的事情的正确方法是使用 C++11 <random>
图书馆。在您的具体示例中,这看起来有点像这样:
std::mt19937 rng (std::random_device{}());
std::uniform_int_distribution<> dist (0, 409);
auto random_number = dist(rng);
有关rand
的邪恶的更多信息以及<random>
的优点看看this .
最后一句话,播种 std::mt19937
就像我上面所做的那样并不是最优的,因为 MT 的状态空间比单次调用 std::random_device{}()
得到的 32 位空间大得多。 。这对于玩具程序和标准学校作业来说不是问题,但仅供引用:Here是我对播种 MT 整个状态空间的看法,以及答案中的一些有用的建议。
关于c++ - rand() 没有给我一个随机数(即使使用 srand() 时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27903779/