C ++中生成的相同随机数

时间:2013-09-22 21:54:50

标签: c++ c random

我现在已经半打了半个小时,不知道出了什么问题。 我正在尝试生成一个包含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;
}

3 个答案:

答案 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