uniform_int_distribution这里用错了? (我的结果似乎分布不均)

uniform_int_distribution used wrong here? (my results seem not equally distributed)

版本 3 将生成器移至 class。这次我的新随机数生成技术正确吗?

template<typename T = int>
    class MyRandomGenerator
    {
    public:
        MyRandomGenerator()
        {
            std::random_device rd;
            gen = std::mt19937{rd()};
        }

        T getNumber(const T& From, const T& To)
        {
            std::uniform_int_distribution<T> dist(From, To);
            return dist(gen);
        }
    private:
        std::mt19937 gen;
    };

这是我的新头寸计算器:

auto calculate_x_position = [&]() ->sf::Uint32 {return RandGen.getNumber(0, W - 1); };
auto calculate_y_position = [&]() ->sf::Uint32 {return RandGen.getNumber(0, H - 1); };

与之前相同 pattern/problem:

版本 2 每秒创建约 3 张地图,每张地图 10.000 颗星。结果还是一样。此外,更清楚的是地图顶部有一个枢轴。示例:

原题: 我开始尝试绘制一个简单的星图。为此,我首先计算星星的 x 和 y 位置。 X和Y在window.

的宽高范围内

这是我的随机数生成函数:

    template<typename T>
    T getRandomNumberBetween(const T& Min, const T& Max)
    {
        static std::random_device rd;
        static std::uniform_int_distribution<T> dist{Min, Max};
        return dist(rd);
    }

我是这样使用的:

auto calculate_x_position = std::bind(inc::getRandomNumberBetween<sf::Uint32>, 0, Width-1);
    auto calculate_y_position = std::bind(inc::getRandomNumberBetween<sf::Uint32>, 0, Height-1);
x = calculate_x_position(); //...

但是当我一遍又一遍地绘制我的地图时,在我看来,大多数星星往往存在的地方都有一个支点。例如。大多数星星都在我的 window.

的上半部分

示例:

我是不是用错了或有错误的期望?...因为here它说:

This distribution produces random integers in a range [a,b] where each possible value has an equal likelihood of being produced.

亲切的问候

均匀分布并不具体意味着你会在屏幕的每个象限中获得相同的数量;这意味着每个点出现的机会均等。所以如果你做一个简单的 50:50 试验,并不意味着你会得到 50:50 个结果。

但是,如果您对 1,000,000 颗星星进行了测试,很可能它们几乎是均匀分布的。对我来说,这似乎是样本量的错误

您可以通过多种方式改进代码。一个引擎只能被创建一次,而不是每次你想要一个随机数。而且您通常不想使用 std::default_random_engine,因为它可能默认为 std::rand。更好的默认值是 std::mt19937。我的示例来自 The bell has tolled for rand():

#include <random>

std::mt19937& prng_engine()
{
  thread_local static std::random_device rd{};
  thread_local static std::mt19937 engine{rd()};

  // Or you can replace the two previous lines with:
  //thread_local static std::mt19937
  //  prng{std::random_device{}()};

  return engine;
}

template<typename T>
T getRandomNumberBetween(T Min, T Max)
{
    thread_local static std::uniform_int_distribution<T> dist{Min, Max};
    return dist(prng_engine());
}