假设我有一个浮点数数组,按排序(假设升序)顺序,其总和已知为 integer N
。我想将这些数字“四舍五入”为整数,同时保持它们的总和不变。换句话说,我正在寻找一种将浮点数数组(调用它 fn
)转换为整数数组(调用它in
)的算法,这样:
- 两个数组的长度相同
- 整数数组的总和是
N
- 每个浮点数
fn[i]
与其对应的整数之间in[i]
的差小于 1(如果确实必须,则等于 1) - 鉴于浮点数按排序顺序 (
fn[i] <= fn[i+1]
),整数也将按排序顺序 (in[i] <= in[i+1]
)
鉴于满足这四个条件,最小化舍入方差 ( sum((in[i] - fn[i])^2)
) 的算法是可取的,但这并不是什么大问题。
例子:
[0.02, 0.03, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.11, 0.12, 0.13, 0.14] => [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1] [0.1, 0.3, 0.4, 0.4, 0.8] => [0, 0, 0, 1, 1] [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1] => [0, 0, 0, 0, 0, 0, 0, 0, 0, 1] [0.4, 0.4, 0.4, 0.4, 9.2, 9.2] => [0, 0, 1, 1, 9, 9] 更可取 => [0, 0, 0, 0, 10, 10] 是可以接受的 [0.5, 0.5, 11] => [0, 1, 11] 很好 => [0, 0, 12] 在技术上是不允许的,但我会在紧要关头接受它
要回答评论中提出的一些很好的问题:
- 两个数组中都允许重复元素(尽管我也有兴趣了解仅在浮点数组不包含重复时才有效的算法)
- 没有单一的正确答案 - 对于给定的浮点输入数组,通常有多个整数数组满足四个条件。
- 我想到的应用程序是 - 这有点奇怪 - 在马里奥赛车游戏中将积分分配给顶级选手 ;-) 我自己从未真正玩过这款游戏,但在观看其他人时,我注意到有 24 分分布在前 4 名完成者,我想知道如何根据完成时间分配积分(因此,如果某人以较大的领先优势完成比赛,他们将获得更大的积分份额)。游戏将总点数作为整数进行跟踪,因此需要这种四舍五入。
对于好奇的人,这是我用来确定哪些算法有效的测试脚本。