gpt4 book ai didi

c++ - 使用 tr1 创建非均匀整数分布

转载 作者:可可西里 更新时间:2023-11-01 17:29:45 26 4
gpt4 key购买 nike

现在,我使用以下代码创建具有范围的整数的均匀分布。 (我把播种码拿出来了)

int random(int min, int max)
{
static std::mt19937 gen;
std::uniform_int<int> dist(min, max);
return dist(gen);

}

我正在尝试修改它以提供一个有利于两个最小值的分布,并且几乎从不产生接近最大值的分布。我可以看到所有预制分布,但它们都不是整数。而且我无法根据任何文档判断哪一个符合我的需求。我最接近的是维基百科上显示的卡方分布,其中 k=2

但我无法弄清楚,基于 documentation如何将它与整数一起使用,更不用说设置 k 值了。

如何设置我的函数以使用适当的非均匀整数分布?


仍在努力选择正确的发行版:这里是 std::poisson_distribution<int> dist((max - min) * .1); 的结果从 0 到 20:

还没有到位,因为 0 应该比 1 更频繁,但它应该可以帮助下一个人,当他们出现时会发布更多结果。


好吧,我的最终解决方案变成了多种方法的组合:

int randomDist(int min, int max)
{
static std::mt19937 gen;
std::chi_squared_distribution<double> dist(2);

int x;
do
{
x = (int)(max*dist(gen)/10) + min;
}
while (x > max);
return x;
}

给出结果:

最佳答案

那里还有其他整数分布,它们只是没有 int在他们的名字里。他们确实有 typedef IntType result_type在他们的类定义中。

如您所描述的行为是:

  • binomial_distribution (t, p)

    这会生成 0 ≤ xt 范围内的数字,因此您需要将范围平移 min .均值为 t·p,因此请选择接近 0 的 p

    std::binomial_distribution<int> dist(max - min, .1);
    return dist(gen) + min;

  • poisson_distribution (λ)

    这会生成 0 ≤ x < ∞ 的数字,但大数字的可能性逐渐降低。您可以审查 max 以上的任何内容将其限制在一个范围内。参数 λ 是平均值。选择它以匹配前面的示例:

    std::poisson_distribution<int> dist((max - min) * .1);
    int x;
    do
        x = dist(gen) + min;
    while (x > max);
    return x;

  • geometric_distribution (p)

    也生成数字 0 ≤ x < ∞,但 0 是最有可能的结果,每个后续数字的可能性都低于前一个。再次选择参数以匹配上一个示例的平均值:

    std::geometric_distribution<int> dist(1 / ((max - min) * .1 + 1));
    int x;
    do
        x = dist(gen) + min;
    while (x > max);
    return x;

您还可以使用任何连续分布来生成 double然后将其四舍五入为 int .

关于c++ - 使用 tr1 <random> 创建非均匀整数分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5296572/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com