【发布时间】:2016-01-03 22:25:52
【问题描述】:
可以有无数种方法将正数表示为numberOfSummands 正数之和,每个正数不超过maxSummand。我需要一种方法来为给定的sum、numberOfSummands 和maxSummand 大致一致地生成其中一个表示,即可以以大致相等的概率返回任何可能的 N 加法列表(只要双浮点精度允许它)。
例子:
asSummands(sum = 41.0, numberOfSummands = 3, maxSummand = 22.0, prng = somePRNG())
可以返回:
[18.3, 5.8, 16.9]
(在实际生成的列表中,点后面肯定会有更多的数字。)
我可以忽略这样一个事实,即使用某些被加数不可能达到某个总和(例如,如果 maxSummand 为 2.0,则无法用 4 个被加数达到 10.0 的总和),假设该算法从未被调用过这样的论点。
我还假设 PRNG 统一生成数字。
我只能想出一个远非统一的解决方案:
将总和切成numberOfSummands相等的和数,选择它们的对,对于每一对,将随机量从对的一个元素转移到另一个元素,这样总和不会改变,然后将号令。它适用于偶数个被加数,我可以修改它以适用于奇数个被和数,但解决方案感觉很愚蠢,我觉得可以有更自然的方法。
【问题讨论】:
-
(注意其他可能接近的选民:有很多关于生成总和为特定数字的数字的问题,但我查看的那些在summands,这使问题变得不同且更难。)
-
这里如何定义“均匀随机”?另外,您是专门讨论作为分割的任意实数,还是整数,或者只是达到固定精度水平的实数?
-
@templatetypedef 除和数和 PRNG 之外的每个参数都是实数。我所说的“均匀随机”是指所有可能的结果都应该具有相同的概率。