JavaScript-生成6个随机百分比,总计100

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

我希望在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.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]