JQ如何把一个数拆成很多个随机数,总和为这个数本身?

1.比如我现在请求到一个1000,要拆分成60个随机数,而这60个随机数相加刚刚好等于1000?
2.我要在五分钟内从0每隔5秒慢慢加60次到1000,这样可以实现吗?
3.六十次后再次请求一个数,比如是3000,那么,把3000再次拆分成60个随机数,从1000慢慢在五分钟内加到4000
求大神相助

阅读 6.1k
2 个回答
function randomDivide(total, nums) {
    rest = total;
    const result = Array.apply(null, { length: nums })
        .map((n, i) => nums - i)
        .map(n => {
            const v = 1 + Math.floor(Math.random() * (rest / n * 2 - 1));
            rest -= v;
            return v;
        });
    result[nums - 1] += rest;
    return result;
}

// testing
const result = randomDivide(1000, 60);
console.log(result.join(","));
console.log(result.length);
console.log(result.reduce((acc, n) => acc + n));

clipboard.png

采用 https://www.zhihu.com/questio... 里讨论的微信分红包算法,达到较为平均的随机分配。

var arr = getRandomNum(1000, 60);
console.log(arr);
console.log(arr.reduce((pre, v) => pre + v, 0));

function getRandomNum(num, times) {
  let res = [];
  if (times === 1) {
    res.push(num);
    return res;
  };
  let max = num / times * 2;
  let current = 1 + (~~(Math.random() * max - 1));
  res.push(current);
  return res.concat(getRandomNum(num - current, --times));
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏