C ++随机函数不是随机的

时间:2014-03-20 15:36:25

标签: c++ random time

在我的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;
}

2 个答案:

答案 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

它对我有用,可以生成随机数。