【问题标题】:Evenly distribute values over a time period在一段时间内平均分配值
【发布时间】:2009-11-17 20:41:29
【问题描述】:

我有数量不定的物品,以及我需要分发它们的可变日期范围。假设我有 3 件物品,我需要在 6 天内分发它们。我想要的是每隔一天就有一个项目,第一天是否有一个项目并不重要。如果我在 6 天内有 7 件物品,那么其中一天会得到 2 件物品,无论哪一天都没有关系。

可悲的是,事实证明我的数学真的很烂,所以我不知道如何以相对漂亮和漂亮的方式做到这一点,或者是否有可能。我可能会以一种 hacky 的方式弄清楚它,但我也希望从中学到一些东西:P

使用的语言是 PHP。

【问题讨论】:

  • 不,这是针对我正在构建的应用程序,我的数学失败了:P

标签: php math


【解决方案1】:
//If you get the period between items:
$period = $days / $items;
//Then you can iterate through the items:
for ($i = 0; $i < $items; $i++)
{
    //and have a function that will add an item to the day number given as a parameter.
    add_item_to_day_number(floor($i * $period));
}

【讨论】:

  • 请注意,$days 和 $items 都只是对天数和项目数的计数。我不小心在 for 循环中输入了“days”而不是“items”,但在编辑中修复了它。 floor() 函数只是删除所有小数位。
【解决方案2】:

本质上,您是在进行除法,然后按顺序分配余数。所以步骤是这样的:

  • 计算天数
  • 计算项目数

  • 如果项目 > 天

    • 将项目数除以 天数(每天的项目)$x
    • 取项目/天的模数$m (这是剩下的)
    • 循环放置 $x 的天数 每天的项目,以及 1 个额外项目 前 $m 天
  • 如果天 > 项目

    • 将天数除以 物品数量(每件物品的天数)$x
    • 以 $x 为单位循环遍历天数 并每天放置 1 件物品(保持 跟踪剩余的物品数量)
    • 当您在最后一天到达时,如果 还有剩余的东西,循环过去 日子再次从第 0+1 天开始, 步步为 $x

【讨论】:

  • 我不确定哪种方法效果最好,但我选择了这种方法,谢谢 :)
  • Oliver 的方法更有效,因为它不需要 2 种不同的方法。这个解决方案不太优雅,但也许更容易理解。
【解决方案3】:

(第 i 天的项目数) = floor( (i+1) * items / days) - floor( i * items / days),其中 i 从 0 开始。

【讨论】:

  • 优雅的解决方案。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-08
  • 2021-08-05
  • 1970-01-01
  • 2014-09-07
  • 1970-01-01
  • 2013-02-18
相关资源
最近更新 更多