Distribute Percent Range, Given Minimum Percent
JavaScript
var range = [190, 2453, 234, 14, 1244, 532, 0, 3, 1999];
var minimumPercent = 0.02;
function distributeRangeGivenMinimum(range, min) {
var sum = 0;
for (var i = 0; i < range.length; i++) {
sum += range[i];
}
var percents = [];
for (var i = 0; i < range.length; i++) {
percents.push(range[i] / sum);
}
var amtToSubtract = 0;
var timesUnderMin = 0;
for (var i = 0; i < range.length; i++) {
if (percents[i] < min) {
amtToSubtract += (min - percents[i]);
timesUnderMin++;
percents[i] = min;
}
}
var timesOverMin = percents.length - timesUnderMin;
// begin new section
do {
var prevTimesOverMin = timesOverMin;
var distSubAmt = amtToSubtract / timesOverMin;
for (var i = 0; i < range.length; i++) {
if (percents[i] > min && percents[i] - distSubAmt < min) {
amtToSubtract -= (percents[i] - min);
timesOverMin--;
percents[i] = min;
}
}
} while (timesOverMin != prevTimesOverMin);
// end new section
if (timesOverMin > 0) {
for (var i = 0; i < range.length; i++) {
if (percents[i] > min) {
percents[i] = percents[i] - (amtToSubtract / timesOverMin);
}
}
}
return percents;
}