在我的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号码完全改变了。 例如,当我开始我的代码时: xRandom = 33 yRandom = 381 当我重新运行我的代码xRandom = 41并重新运行10次后看起来像这样:53,56,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;
}
答案 0 :(得分:1)
你使用rand()
似乎是相对标准的。 rand()
臭名昭着是一个糟糕的随机数据来源,也许您正在使用的实施方式比这种特殊方式更糟糕。您可能会找到一个允许您使用该特定实现的解决方案,但我建议您转移到另一个随机数源。
C ++ 11引入了<random>
库,它提供了保证质量的随机设施,功能更强大,更灵活,更易于使用。只要它可用,它应该是首选。
要在C ++ 11中使用<random>
库,您可以创建并播种随机源:
#include <random>
std::random_device r;
std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
std::mt19937 engine(seed);
然后使用'distributions'从引擎中获取随机数据并生成随机数:
std::uniform_int_distribution<> dist(1, 6);
int die_roll = dist(engine);
对于您的使用,您可能会让引擎成为Game
的成员:
class Game {
std::mt19937 engine;
// ...
然后在drawBlock()
:
xRandom = std::uniform_int_distribution<>(1, 620)(engine);
yRandom = std::uniform_int_distribution<>(1, 440)(engine);
答案 1 :(得分:0)
我是这样做的:
int a;
srand(time(NULL));
a=rand()%100+1
它对我有用,可以生成随机数。