c++随机函数不随机

C++ random function not random

本文关键字:随机 函数 c++      更新时间:2023-10-16

在我的c++代码中,我有一个问题。我的随机drawBlock函数应该返回xRandom和yRandom,但不是那么随机。

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数字几乎是相同的。而我的随机数完全改变了。例如,当我开始写代码时:xRandom = 33yRandom = 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;
}

您对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);

然后使用'分布'从引擎中获取随机数据并产生随机数:

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);

我的做法如下:

int a;
srand(time(NULL));
a=rand()%100+1

它为我工作,生成一个随机数