如何在C++中生成满足特定比率的随机数?

68de4m5k  于 2023-02-26  发布在  其他
关注(0)|答案(2)|浏览(247)

在为游戏生成树的上下文中考虑这段人造代码:

// Pretend there's some code somewhere that associates the 0-100 number to its corresponding size.
enum class TreeSize : uint32_t
{
    Small, // 0-9
    Medium, // 10-60
    Large,// 61-90
    ExtraLarge, // 91-100

};

// returns tree size
int GenerateTree()
{
    std::random_device rd;
    std::mt19937_64 mt(rd());
    std::uniform_int_distribution<int32_t> dist(0, 100);

   return dist(s_mt);
}

假设我想生成1000棵树,但要绑定到树大小的特定比率。例如:

  • 小树:15%
  • 中型树木:百分之三十
  • 大树:百分之四十
  • 特大型树木:15%

我该怎么做?**有现成的东西可以做到这一点吗?**这肯定是许多人以前不得不面对的问题,是吗?

hi3rlvi2

hi3rlvi21#

您需要的是std::discrete_distribution,其中可以分别为每个项目指定概率权重:

int GenerateTree()
{
    std::random_device rd;
    std::mt19937_64 mt(rd());
    std::discrete_distribution<int32_t> dist({15, 30, 40, 15});

    return dist(s_mt);
}
c90pui9n

c90pui9n2#

你可以用std::piecewise_constant_distribution生成一个指定分布的浮点数,但是注意你应该保留mt对象,而不是每次都重新初始化它。

struct TreeGenerator {
    std::mt19937 mt;
    TreeGenerator() : mt{std::random_device{}()} {}

    double operator()() {
        std::vector<double> i{0,  10, 61, 91, 101};
        std::vector<double> w{15, 30, 40, 15};
        std::piecewise_constant_distribution<double> dist(i.begin(), i.end(), w.begin());
        return dist(mt);
    }
};

Here's a live example of how to use this.

相关问题