改变uniform_int_distribution的范围

2021-12-21 00:00:00 random distribution c++ c++11

所以我有一个随机对象:

So i have a Random object:

typedef unsigned int uint32;

class Random {
public:
    Random() = default;
    Random(std::mt19937::result_type seed) : eng(seed) {}

private:
    uint32 DrawNumber();
    std::mt19937 eng{std::random_device{}()};
    std::uniform_int_distribution<uint32> uniform_dist{0, UINT32_MAX};
};

uint32 Random::DrawNumber()
{
    return uniform_dist(eng);
}

我可以改变(通过另一个函数或其他方式)分布上限的最佳方法是什么?

What's the best way I can vary (through another function or otherwise) the upper bound of of the distribution?

(也愿意接受其他风格问题的建议)

(also willing to take advice on other style issues)

推荐答案

分发对象是轻量级的.当您需要随机数时,只需构建一个新的分布.我在游戏引擎中使用这种方法,经过基准测试后,它可以与使用旧的 rand() 相媲美.

Distribution objects are lightweight. Simply construct a new distribution when you need a random number. I use this approach in a game engine, and, after benchmarking, it's comparable to using good old rand().

此外,我在 GoingNative 2013 直播中询问了如何改变分发范围,标准委员会成员 Stephen T. Lavavej 建议简单地创建新分发,因为它不应该是表演问题.

Also, I've asked how to vary the range of distribution on GoingNative 2013 live stream, and Stephen T. Lavavej, a member of the standard committee, suggested to simply create new distributions, as it shouldn't be a performance issue.

以下是我将如何编写您的代码:

Here's how I would write your code:

using uint32 = unsigned int;

class Random {
public:
    Random() = default;
    Random(std::mt19937::result_type seed) : eng(seed) {}
    uint32 DrawNumber(uint32 min, uint32 max);

private:        
    std::mt19937 eng{std::random_device{}()};
};

uint32 Random::DrawNumber(uint32 min, uint32 max)
{
    return std::uniform_int_distribution<uint32>{min, max}(eng);
}

相关文章