红包的随机分配

使用random函数每次随机分配 每次得出的红包值大于0.01小于剩余金额-剩余人数*0.01 最后一个人获得剩余全部就行

这个想法用算法怎么表示啊,想了很久都没有想法

阅读 3.1k
2 个回答
function rp(total, n) {
  var remain = total
  var ret = []
  for (let i = 0; i < n - 1;i++) {
    let m = Math.ceil(Math.random() * 100 * (remain - (n - (i + 1)) * 0.01)) / 100
    ret.push(m)
    remain -= m
  }
  ret.push(Number(remain.toFixed(2)))
  return ret
}

想法就不对。提问嘛,最好先说效果,再说思考。

  1. 你要先定,精度是 2 位小数。
  2. 不是大于0.01 ,而是 大于等于0.01

在这两个前提下:

  1. 设总金额为 S ,总人数为 N ,是小金额为 M 。( M = 0.01 )
  2. 首先检查, M * N >= S ,否则无法分配。
  3. 计算上,先定每个人已有 M ,剩下的金额就是 S - M * N 。
  4. 问题转化为 S - M * N 怎么分配。
  5. 这个就简单了,每次迭代,取 [0, L] 即可, L <= 0 ,不用迭代了。 L = S - M * N - sum(Pn) , Pn 为第 N 个人在 M 基础上多出的金额。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题