我写了这个函数:
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 如何解决?
答案 0 :(得分:7)
srand
用于初始化生成器。您应该初始化一次,例如在计划开始时。然后拨打rand
。
现在,每次调用该函数时都要初始化它。它之所以相同是因为你为srand
提供了两次相同的参数。 time(0)
返回从纪元到当前时间的秒数。
基本上,每隔一次后续调用同一状态,就会重新启动生成器。如果让它运行3秒钟,你会看到3组不同的值。
你的公式也有些错误。你忘了把它转移到最低限度。
rand()%(max-min+1)+min
此外,如果您使用c++
,您可以从FreeNickname中获取建议并使用c++
特定功能。
答案 1 :(得分:2)
问题是x
和y
几乎立即初始化。因此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功能。