uniform_int_distribution用错在这里? (我的结果似乎不平均分配)(uni

2019-10-22 08:13发布

第3版感动发电机为一类。 是我的新的随机数生成技术修正这个时间呢?

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

同样的模式/问题依旧:

版本2创建〜3点%的每张地图10.000分第二的地图。 结果还是一样。 此外,它有一个旋转的地图上会变得更加清晰。 例:

原题:我走进试图得出一个简单的星图。 为此,我首先计算星星的x和y位置。 X和Y是窗口的宽度和高度的范围内。

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

    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(); //...

但正如我画我的地图一遍又一遍在我看来,有一个支点到大多数恒星往往是。 例如,大多数明星都在我窗口的上半部分。

例:

我使用的是错误的或者在这里有一个错误的期望......因为? 在这里 ,它说:

这种分布在一个范围内产生随机整数[A,B],其中每一个可能的值具有所生产的相等可能性。

亲切的问候

Answer 1:

均匀分布并没有特别的意思,你会得到在屏幕的每个象限相等的; 这意味着有出现在每个点的一个平等的机会。 所以,如果你做一个简单的试用50:50,这并不意味着你会得到50:50的结果。

但是,如果你做了一个测试用说百万恒星很可能,他们将几乎均匀分布。 对我来说,这似乎是在样本规模的错误



Answer 2:

有几个方法,你可以改善你的代码。 发动机只是为了创建一次,每次不想要一个随机数。 而你通常不希望使用std::default_random_engine因为它可能会默认为std::rand 。 更好的是默认std::mt19937 。 我的例子是从拉钟敲响了对兰特() :

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


文章来源: uniform_int_distribution used wrong here? (my results seem not equally distributed)