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, 1, 1, 9, 9] 更加可取。 => [0, 0, 0, 0, 10, 10] 可接受。 [0.5, 0.5, 11] => [0, 1, 11] 可以。 => [0, 0, 12] 在技术上不被允许,但在紧急情况下可以使用。
回答一些评论中提出的好问题:
- 在两个数组中都允许有重复的元素(尽管我也想听听仅当浮点数数组不包含重复元素时才起作用的算法)。
- 没有单一正确的答案 - 对于给定的浮点数组,通常有多个整数数组满足这四个条件。
- 我所考虑的应用场景是 - 这有点奇怪 - 在MarioKart游戏中向获胜者分配积分;-)我自己从未玩过这个游戏,但是在看别人玩时,我注意到前4名之间分配了24个积分,并且我想知道如何根据完成时间分配积分(因此,如果某人领先很大,他们将获得更大的积分份额)。 游戏将整数跟踪为总积分,因此需要这种舍入。
对于好奇的人,这里是我用来确定哪些算法可行的测试脚本。