Javascript 随机分配/分发数量

Javascript 随机分配/分发数量,javascript,math,random,Javascript,Math,Random,假设我有8个人和5000个苹果 我想把所有的苹果分发给所有8个人,这样我就没有剩下苹果了。但是每个人都应该得到不同数量的苹果 最好的办法是什么 我从以下几点开始: let people=8 让苹果=5000 函数getRandomInt(最小值、最大值){ 返回Math.floor(Math.random()*(max-min+1))+min } 而(人--){ //最后一个人得到剩下的 设x=people?getRandomInt(0,apples):apples //减去我剩下多少个苹果

假设我有8个人和5000个苹果 我想把所有的苹果分发给所有8个人,这样我就没有剩下苹果了。
但是每个人都应该得到不同数量的苹果

最好的办法是什么

我从以下几点开始:

let people=8
让苹果=5000
函数getRandomInt(最小值、最大值){
返回Math.floor(Math.random()*(max-min+1))+min
}
而(人--){
//最后一个人得到剩下的
设x=people?getRandomInt(0,apples):apples
//减去我剩下多少个苹果
苹果-=x
log(`Giving person${people+1}${x}apples(got${apples}left)`)

}
如果每次都需要随机但“平衡”的结果,则需要对平衡或随机性进行优先级排序。根据您的“WideTGAP”要求,这里有一个可能的解决方案:

函数随机增量(长、宽、长){
//宽贴图>=长度*2-1
设三角洲=[];
设和=0;
让start=0;
让origLength=长度;
while(长度--){
开始+=1+数学地板(数学随机();
deltas.push(启动);
总和+=开始;
}
设rem=原始长度的总和百分比;
let correction=remToGet-rem;
如果(校正!==0){
总和-=三角洲[0];
增量[0]+=校正;
if(增量[0]>=增量[1]){
三角洲[0]=初始长度;
}
else if(增量[0]<增量[1]-WidtGap){
三角洲[0]+=初始长度;
}
总和+=增量[0];
}
返回{
三角洲,
总和
};  
}
函数随机分布(苹果、人){
让rem=苹果%的人;
设{delta,sum}=随机delta(人,人*2-1,rem);
让div=(apples-sum)/人;
让分布=[];
while(增量长度){
distribution.push(div+delta.shift());
}
收益分配;
}
控制台日志(随机分布(5000,8));

控制台日志(随机分布(2500,6))我想我明白了。只是有点叽叽喳喳

让x=人?getRandomInt(0,数学地板(苹果/人)):苹果

let people=8
让苹果=5000
函数getRandomInt(最小值、最大值){
返回Math.floor(Math.random()*(max-min+1))+min
}
而(人--){
//最后一个人得到剩下的
设x=人?getRandomInt(0,数学地板(苹果/人)):苹果
//减去我剩下多少个苹果
苹果-=x
log(`Giving person${people+1}${x}apples(got${apples}left)`)

}
你可以把80%的苹果平均分配给他们,然后随机分配最后20%。根据口味调整百分比。您还可以根据人数var minPercentage=(100/人)-10//或您希望的任何差异设置苹果的最小百分比,然后检查每个人的苹果是否等于或大于最小百分比。您需要一个数组来存储它们,并在打印任何内容之前运行检查;imore的一个臭名昭著的方法是尝试选取N个均匀分布的随机数,其总和为M(这并不像听起来那么明显)。在没有任何其他信息的情况下,我建议你可能想要模拟一个过程,你随机选择一个人给一个苹果,5000次,这通常会给每个人提供大致相同数量的苹果,但可以以极低的概率将所有苹果给一个人@sh1 see提到的“选取N个均匀分布的随机数,求和为M”很聪明,但有一个问题是它是可预测的。每次运行它的结果总是相同的。我希望每次都是随机的。我还认为它是等分的(最大值和最小值之间的差值只有15)用随机平衡分布方法的插图更新了代码。这并不是说你可以随意更改参数(例如尝试2500和6;甚至2600和9!)。