【问题标题】:Random number generator returning the same value (C++) [duplicate]返回相同值的随机数生成器(C++)[重复]
【发布时间】:2014-02-22 13:56:10
【问题描述】:

我一直在尝试为动态分配的实例数组生成一个随机数,但每次我尝试时,每个实例总是被赋予完全相同的值:

//IN MAIN
Enemy* enemy;
int num;
std::cout << "How many enemies would you like there to be?" << std::endl;
std::cin >> num;
enemy = new Enemy[num];

for (int q = 0; q < num; q++)
{
    enemy[q].setAngle();
}

for (int q = 0; q < num; q++)
{
    std::cout << enemy[q].getAngle() << std::endl;
}

//IN THE ENEMY CLASS
void Enemy::setAngle()
{
    srand(time(NULL));
    angle = rand() % 360 + 1;
}

int Enemy::getAngle()
{
    return angle;
}

输出将始终是 1 到 360 之间的数字,但是当调用 getAngle() 时,输出只是在多行上重复的相同数字。为什么会这样?我做错了什么,我该如何解决?

提前致谢

【问题讨论】:

  • 每次得到随机数时尽量不要重新初始化种子。如果你在很短的时间内多次初始化种子,你可能会得到相同的种子,然后得到相同的数字
  • 我认为time 的分辨率是 1 秒,因此您每次调用该函数时都可能使用相同的值进行初始化(参见上面的注释)。

标签: c++ class random dynamic-memory-allocation


【解决方案1】:

每次调用setAngle 时,您都在为随机数生成器播种。如果这一切都在一秒钟内发生(这是time 的分辨率),它将始终以相同的值作为种子,因此以相同的伪随机值开始。相反,您应该只在程序开始时调用一次srand

【讨论】:

  • 天哪,它成功了!太感谢了!这个虫子已经让我痒了好几个星期了。我从来没有被告知 srand 最好声明一次。谢谢!
猜你喜欢
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 2013-01-31
  • 2019-05-21
  • 2011-06-12
相关资源
最近更新 更多