我现在已经半打了半个小时,不知道出了什么问题。 我正在尝试生成一个包含10个随机数的列表,1-100。但是当我运行它们时,它们都会出现相同的数字。这非常令人沮丧!我认为这是因为数字仍然存储在RAM中,但在将随机数和变量重新随机化三次后,它仍然会出现相同的数字。我做错了什么?
代码:
main() {
int i;
int randnum;
srand(time(NULL));
randnum = rand() % 2;
for (i = 0; i < 10; i++) {
srand(time(NULL));
randnum = rand() % 100 + 1;
srand(time(NULL));
rand();
list[i] = randnum;
srand(time(NULL));
randnum = rand() % 100 + 1;
srand(time(NULL));
rand();
}
srand(time(NULL));
randnum = rand() % 100 + 1;
}
答案 0 :(得分:7)
不要多次拨打srand()
。这段代码可能需要不到一秒的时间来执行,因此每当你在实现时以秒为单位调用时间时调用srand(time(NULL))
,你只需将伪随机数生成器重置为相同的种子,所以你的所有数字都会出来同样的。
答案 1 :(得分:3)
请勿使用srand(time(NULL))
重新初始化生成器。在代码的开头只使用一次。
答案 2 :(得分:3)
你做错了是你正在重置随机数发生器的状态。
它不明显的原因是因为你正在使用时间。 time返回time_t,根据标准是“实现对当前日历时间的最佳近似”。这通常表示自UTC时间1970年1月1日00:00起的秒数。现在,您的代码可能会在一毫秒内执行,因此您所有的时间调用都会返回相同的值。
所以你的代码相当于:
int const somenum = time(NULL);
srand(somenum); //reset state using some seed.
//rand() will always produce the same value after an
// srand call of the same seed.
randnum = rand() % 100 + 1;
srand(somenum); //reset state using some seed.
randnum = rand() % 100 + 1;
srand(somenum); //reset state using some seed.
randnum = rand() % 100 + 1;
srand(somenum); //reset state using some seed.
randnum = rand() % 100 + 1;
为了测试这一点,等待每次调用rand之间的按键,你会发现它们是不同的。
解决这个问题的方法是在开始时只调用一次srand(time(NULL))。
现在,在C ++ 11中,还有另一种方法:
#include <iostream>
#include <random>
int main()
{
const int rand_max = 20;
std::default_random_engine rng(std::random_device{}());
std::uniform_int_distribution<> dist(0, rand_max);
std::cout<<"This will always be as random a number as your hardware can give you: "<<dist(rng)<<std::endl;
return 0;
}
std :: random_device使用内置的硬件随机数生成器(如果可用),因此您不必担心随着时间的推移播种。如果你真的想要一个伪随机数,那么只需使用一个不同的随机数生成器。
您也可以在C ++ 11中使用control the random number distribution。