【发布时间】:2014-04-27 14:05:35
【问题描述】:
在我的 c++ 代码中,我遇到了问题。 我应该返回 xRandom 和 yRandom 的随机 drawBlock 函数并不是那么随机。
void Game::drawBlock()
{
int xRandom, yRandom;
std::cout<<time(NULL) << std::endl;
xRandom = (rand () % 620) + 1;
yRandom = (rand () % 440) + 1;
std::cout << "x: " << xRandom << std::endl;
std::cout << "y: " << yRandom;
mBlock.setSize(sf::Vector2f(20,20));
mBlock.setPosition(xRandom,yRandom);
mBlock.setFillColor(sf::Color::Red);
}
所以基本上发生的是第一个随机数,在这种情况下 xRandom 并不是真正随机的。当我运行程序时,一切似乎都很好 xRandom 得到一个随机数, yRandom 得到一个随机数。但是当我重新启动程序时,我的 xRandom 数几乎相同。 而我的 yRandom 数字完全改变了。 所以例如当我开始我的代码时: x随机= 33 y随机 = 381 当我重新运行我的代码 xRandom = 41 并重新运行它 10 次后看起来像这样:55,66,84,101,125,140,180,201,234,251 奇怪的是,新的 xRandom 总是比上一个多。
这是我称之为 srand 的代码:
#include <SFML/Graphics.hpp>
#include "Game.h"
int main()
{
srand(time(0));
Game game;
game.run();
return 0;
}
【问题讨论】:
-
你用什么作为随机数的种子?
-
使用uniform_int_distribution 可能会为您省去一些麻烦,链接答案中有一个简短的示例,我也包含了一个提升示例。
-
为了测试随机分布,你应该多次调用
game.run(),不要多次执行你的程序。 -
也许第一次调用
rand会返回种子——在这种情况下,如果您在几秒钟内再次运行程序,您将获得类似的值。无论如何,rand不会提供高质量的伪随机性。如果可以,请使用 C++11<random>库。 -
如果您真的认为在库的实现中第一次调用
rand()存在问题,您可以尝试在为生成器播种后在短循环中调用rand()以消耗初始值( s)。