【问题标题】:weighted random n-times optimization加权随机 n 次优化
【发布时间】:2020-06-20 11:09:46
【问题描述】:

一个数组中有 10 个加权元素。我想随机选择一个元素N次,然后统计每个元素出现的次数。有没有一种算法可以让我计算元素数量而无需选择N 次? N 可能是一个很大的数字,在这种情况下必须生成 N 样本是低效的。

例如: 一个盒子里有2个红球和8个白球。从盒子里随机挑选一个球,然后放回去,重复100次。计算捡起红球或白球的总次数。

我想知道是否可以在不采样 100 次的情况下获得计数。

【问题讨论】:

  • 如果我正确理解您的问题,您想从multinomial distribution 中抽取样本。您是否使用任何特定的语言? (例如,Python/NumPy 已经为此提供了功能。)
  • 你能添加一个例子吗?这个问题对我来说不是很清楚。
  • @Yonlif 我已经添加了示例
  • @MarkDickinson 是的,我就是这么说的。我使用 C++。
  • @Rhysol:我稍微改写了这个问题;我希望我没有在这个过程中改变意思。

标签: c++ algorithm random


【解决方案1】:

假设数组有 n 个元素。令 X1, X2, ..., Xn 表示随机变量,其中 Xi 表示第 n 个元素出现的次数,然后以 X1 = x1, X2 = x2, ... 和 X(i-1)=x 为条件(i-1),Xi 服从binomial distribution,参数为 (N - x1 - x2 - ... - x(i-1)) 和 1 / (n - i + 1)。所以你可以按如下顺序绘制 X1, X2, ..., Xn:

#include <iostream>
#include <random>

template <typename Iter, typename Int_type>
void draw(Iter begin, Iter end, Int_type N)
{
    auto n = std::distance(begin, end);
    static std::mt19937 gen{std::random_device{}()};
    while (begin != end) {
        std::binomial_distribution<Int_type> d(N, 1 / static_cast<double>(n));
        auto number = d(gen);
        *begin++ = number;
        --n;
        N -= number;
    }
}

int main()
{
    unsigned count[10];
    draw(std::begin(count), std::end(count), 10000u);
    for (auto i : count) std::cout << i << ", ";
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-08
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 2014-09-24
    • 1970-01-01
    • 2022-07-06
    相关资源
    最近更新 更多