使用srand()生成随机数

时间:2013-12-11 07:21:39

标签: c++ c

我写了这个函数:

int getRandomNumber(int min,int max)
{
    srand(time(NULL));
    return rand()%(max-min+1);
}

并称之为:

 int x=getRandomNumber(0,2);
 int y=getRandomNumber(0,2);

但是我总是得到相同的x和y值,即总是x = y 如何解决?

3 个答案:

答案 0 :(得分:7)

srand用于初始化生成器。您应该初始化一次,例如在计划开始时。然后拨打rand

现在,每次调用该函数时都要初始化它。它之所以相同是因为你为srand提供了两次相同的参数。 time(0)返回从纪元到当前时间的秒数。

基本上,每隔一次后续调用同一状态,就会重新启动生成器。如果让它运行3秒钟,你会看到3组不同的值。

你的公式也有些错误。你忘了把它转移到最低限度。

rand()%(max-min+1)+min

此外,如果您使用c++,您可以从FreeNickname中获取建议并使用c++特定功能。

答案 1 :(得分:2)

问题是xy几乎立即初始化。因此time(NULL)在两种情况下都返回相同的值。 你可以初始化一次,如luk32建议的那样。但更好的选择是避免使用rand()。 C ++ 11中有新的选项,在随机性和易用性方面更好。 看看这个演示文稿: rand considered harmful.

您想要的代码示例(我没有机会测试它):

#include <random>

int getRandomNumber(int min,int max)
{
    std::random_device randomDevice; //I put it here just for simplification. Creating a random device is slow, so you should avoid creating it every time.
    std::mt19937 rgen(randomDevice()); // mersenne_twister
    std::uniform_int_distribution<int> uniformDistribution(min, max); // min and max are included
    return uniformDistribution(rgen);
}

答案 2 :(得分:0)

Rand is considered harmful使用新的c ++ 11功能。