JavaScript-生成6个随机百分比,总计100
我希望在JavaScript中生成6个随机百分比,总计100个。我不希望最大和最小百分比之间的差异超过20% 最有效的方法是什么JavaScript-生成6个随机百分比,总计100,javascript,random,numbers,percentage,Javascript,Random,Numbers,Percentage,我希望在JavaScript中生成6个随机百分比,总计100个。我不希望最大和最小百分比之间的差异超过20% 最有效的方法是什么 非常感谢。这是部分解决方案: function get_6_rands() { var rands = [], rand, total = 0, normalized_rands = []; for (var i = 0; i < 6; i += 1) { rand = Math.random(); rands.p
非常感谢。这是部分解决方案:
function get_6_rands() {
var rands = [], rand, total = 0, normalized_rands = [];
for (var i = 0; i < 6; i += 1) {
rand = Math.random();
rands.push(rand);
total += rand;
}
for (var i = 0; i < 6; i += 1) {
rand = rands[i] / total;
normalized_rands.push(rand);
}
return normalized_rands;
}
function_is_valid(attempt) {
return true; // implement `is_valid` yourself
}
do {
var attempt = get_6_rands();
} while (is_valid(attempt) === false);
console.log(attempt); // success!
函数get_6_rands(){
var rands=[],rand,total=0,归一化的随机数=[];
对于(变量i=0;i<6;i+=1){
rand=Math.random();
rands.push(兰德);
总数+=兰特;
}
对于(变量i=0;i<6;i+=1){
兰特=兰特[i]/总计;
标准化随机推力(rand);
}
返回标准化随机数;
}
函数\u有效(尝试){
return true;//自己实现'is_valid'
}
做{
var trunt=get_6_rands();
}while(有效(尝试)==false);
console.log(尝试);//成功!
该函数将生成6个随机数,这些随机数一起为1
。这是通过标准化实现的。如果你想要整数(而不是浮点数),你需要做一些聪明的事情,仅仅四舍五入是不够的
您可以通过检查需求来获得
20%
需求,如果失败,请重试,并继续尝试,直到获得满足您需求的需求。你最终应该会得到一个,毕竟它是随机的。首先,你要做一个100到120之间的随机数数组,如下所示:
var arPercentages = [];
for(var i = 0; i < 6; i++) {
arPercentages.push(Math.random()*20 + 100);
}
var total = arPercentages[0] + arPercentages[1] + arPercentages[2] + arPercentages[3] + arPercentages[4] + arPercentages[5];
最后,对每个数字进行除法和乘法:
for (var i = 0; i < 6; i++) {
arPercentages[i] = arPercentages[i] / total * 100;
}
for(变量i=0;i<6;i++){
a百分之[i]=a百分之[i]/总计*100;
}
你有一个数组,它有6个百分比,加起来等于100,并且在基值的100%到120%之间(但这非常接近)我也有类似的问题。这样做的一个好处是,不仅数字是随机的,而且数组中最大的项目也是随机的,因为数组已经被洗牌了 否则,大多数情况下,第一个数字将是最大的,第二个数字将是第二大的,以此类推 另一件好事是,这将生成您想要的任意多个分段,并且您可以为最大分段设置一个上限。e、 如果你想把总数加到100,你的第一个数字不会是99.9。
var generateProportion=function(){
var max=100,
分段最大值=60,
tempResults=[],
剩余=最大值,
分段=5,
最终结果=[];
//创建一系列随机数并将其放入数组中
对于(变量i=1;i 0){
var index=Math.floor(Math.random()*tempResults.length);
finalResults=finalResults.concat(tempResults.splice(索引,1));
}
返回最终结果;
}
变量比例=生成比例();
风险价值总额=比例减少((a,b)=>a+b);
console.log(比例,“=”,总计)代码>
我不得不解决一个类似的问题。我就是这样做的:
const random = (min, max) => {
return min + Math.random() * (max - min);
};
const randomFill = (amount, min, max) => {
const arr = [];
let total = 0;
// fill an array with random numbers
for (let i = 0; i < amount; i++) arr.push(random(min, max));
// add up all the numbers
for (let i = 0; i < amount; i++) total += arr[i];
// normalise so numbers add up to 1
for (let i = 0; i < amount; i++) arr[i] /= total;
return arr;
};
这是一个JSIDLE:仅限整数?允许零作为值吗?它们必须是唯一的还是可以有重复的?最好是整数。不允许将零作为值。允许重复。对不起,我说得不清楚。当我运行这个代码时,数字总是在15到18之间。我认为你误解了20%的规则。我认为像16,16,16,8,28这样的结果是允许的,因为28-8=20。正确。允许两个值之间存在20%的差异,但这将是最大值,或者有一种设置方法。
const values = randomFill(6, 0.2, 0.5);
// [0.1549, 0.2023, 0.1681, 0.0981, 0.1621, 0.2141]