【发布时间】:2013-10-31 23:26:32
【问题描述】:
我需要在一个包含n元素的小数组中随机分配一个大整数budget,这样数组中的所有元素将具有相同的分布,并且总和为budget,并且数组中的每个元素都得到至少min。
我有一个在 O(budget) 中运行的算法:
private int[] distribute(int budget, int n, int min) {
int[] subBudgets = new int[n];
for (int i = 0; i < n; i++) {
subBudgets[i] = min;
}
budget -= n * min;
while (budget > 0) {
subBudgets[random.nextInt(n)]++;
budget--;
}
return subBudgets;
}
但是,当budget 增加时,它可能会非常昂贵。有什么算法可以在 O(n) 甚至更好的时间内运行吗?
【问题讨论】:
-
您想要实现的随机分布是什么?随机分布有很多种,有些很容易应用于
O(n)中的案例,有些则不然。 -
@RBarryYoung:他已经隐含地提供了该信息:他希望通过将单个美元随机分配到每个预算直到它们全部消失来获得分配。这将是具有
budget试验、n类别的多项分布,并且每个类别的概率为1/n。 -
@j_random_hacker 不,这是你的假设,他从未说过。他所说的只是“distribute..randomly”,这是尽可能模棱两可的,根据我的经验,这通常意味着他们没有真正考虑过不同类型的随机分布的含义。如果这真的是 OP 想要的,那么他所要做的就是说出来,但对于不知道其名称的人来说,这是一个相当奇怪但特定的分布。
-
抱歉我的模棱两可。我已对其进行了更新,以明确声明 n 个元素具有相同的分布。
-
@RBarryYoung:不,他通过他提供的算法隐含地给出了他想要的分布。该算法从具有我描述的参数的多项分布中采样——通过提供该代码 sn-p,他消除了任何潜在的歧义。此外,我不认为多项分布是“奇怪的”——它肯定是更常见的分布之一,尽管很多使用它的人不知道它的名字。