【问题标题】:C++ random function not randomC++ 随机函数不是随机的
【发布时间】: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 &lt;random&gt; 库。
  • 如果您真的认为在库的实现中第一次调用rand() 存在问题,您可以尝试在为生成器播种后在短循环中调用rand() 以消耗初始值( s)。

标签: c++ random time


【解决方案1】:

您对rand() 的使用似乎是相对标准的。 rand() 作为随机数据的不良来源而臭名昭著,也许您使用的实现在这种特殊方式上比平常更糟糕。您可能会找到一个允许您使用该特定实现的解决方案,但我建议您转向另一个随机数来源。

C++11 引入了&lt;random&gt; 库,它提供了质量有保证的随机工具,更强大、更灵活、更易于使用。只要可用,就应该首选它。

要在 C++11 中使用 &lt;random&gt; 库,您需要创建并播种随机源:

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

【讨论】:

    【解决方案2】:

    我是这样做的:

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

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

    【讨论】:

      猜你喜欢
      • 2011-11-07
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 2012-10-04
      • 1970-01-01
      • 1970-01-01
      • 2013-11-12
      • 2016-11-07
      相关资源
      最近更新 更多