【发布时间】:2017-10-02 17:17:07
【问题描述】:
假设我有 8 个人和 5000 个苹果。
我想把所有的苹果都分发给 8 个人,所以我没有剩下苹果了。
但每个人都应该得到不同的数量
将它们全部释放出来的最佳方式是什么?
我是从这个开始的:
let people = 8
let apples = 5000
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min
}
while (people--) {
// last person get the rest
let x = people ? getRandomInt(0, apples) : apples
// subtract how many apples i got left
apples -= x
console.log(`Giving person ${people + 1} ${x} apples (got ${apples} left)`)
}
但我不喜欢的是最后一个人得到的苹果很少(有时少于 5 个),而第一个人得到的苹果比其他人多
【问题讨论】:
-
您可以取 80% 的苹果,然后将它们平均分配,然后随机分配最后的 20%。根据口味调整百分比。
-
您还可以根据人数 var minPercentage = (100 / 人) - 10// 或任何您想要的差异来设置苹果的最小百分比,然后检查苹果是否每人等于或大于最小百分比。您需要一个数组来存储它们,并在打印任何内容之前运行检查。
-
你能给我举个例子吗?
-
有很多不同的方法;最臭名昭著的一个是尝试选择 N 个随机数,均匀分布,总和为 M(这并不像听起来那么明显)。在没有任何其他信息的情况下,我建议您可能想要模拟一个过程,您可以选择一个随机的人给一个苹果,5000 次,这通常给每个人大致相同数量的苹果,但可以,非常概率低,把所有的苹果给一个人。
-
@sh1 提到的“选择 N 个均匀分布的随机数,总和为 M”问题的简单解决方案见 this answer
标签: javascript math random