0

我已经用头撞了半个小时了,不知道出了什么问题。我正在尝试生成 10 个随机数 1-100 的列表。但是当我运行它时,它们都会出现相同的数字。这是非常令人沮丧的!我以为是因为这个数字仍然存储在RAM中,但是将随机数和变量重新随机化3次后,它仍然是相同的数字。我究竟做错了什么?

代码:

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;
}
4

3 回答 3

7

不要srand()多次调用。这段代码可能需要不到一秒的时间来执行,所以每次srand(time(NULL))在你的实现中以秒为单位测量时间时调用,你只需将伪随机数生成器重置为相同的种子,所以你所有的数字都是一样的。

于 2013-09-22T21:56:55.620 回答
3

不要用srand(time(NULL)). 仅在代码开头使用一次。

于 2013-09-22T21:56:29.160 回答
3

您做错的是您正在重置随机数生成器的状态。

它不明显的原因是因为您正在使用时间。time 返回 time_t,根据标准,它是“实现对当前日历时间的最佳近似”。这通常表示自 1970 年 1 月 1 日 00:00 UTC 以来的秒数。现在,您的代码可能会在一毫秒内执行,因此您的所有时间调用都返回相同的值。

所以你的代码相当于:

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 中的随机数分布

于 2013-09-22T22:07:40.677 回答