Skip to content

Instantly share code, notes, and snippets.

@ashish-r
Last active June 29, 2020 18:30
Show Gist options
  • Save ashish-r/bcb99b45247256cbf4c7fce6e9603024 to your computer and use it in GitHub Desktop.
Save ashish-r/bcb99b45247256cbf4c7fce6e9603024 to your computer and use it in GitHub Desktop.
Get `n` random numbers between 2 given numbers having average `x`
function getRandom(min, max) {
return Math.random() * (max - min) + min;
}
function getArr(size, avg, min, max) {
let arr = [];
let tmax = max;
let tmin = min;
while (arr.length < size) {
const variable1 = +getRandom(min, tmax).toFixed(1);
let variable2 = +(avg * 2 - variable1).toFixed(1);
if (variable2 < min) {
tmax = max - (min - variable2);
variable2 = min;
} else if (variable2 > max) {
tmin = min + (variable2 - max);
variable2 = max;
} else {
tmax = max;
tmin = min;
}
arr = arr.concat([variable1, variable2]);
}
let sumErr = arr.reduce((a, b) => a + b, 0) - avg * size;
if (sumErr > 0) {
arr = arr.map((x) => {
if (x > min && sumErr > 0.001) {
let maxReduce = x - min;
if (maxReduce > sumErr) {
const toReturn = +(x - sumErr).toFixed(1);
sumErr = 0;
return toReturn;
} else {
sumErr -= maxReduce;
return min;
}
}
return x;
});
} else {
arr = arr.map((x) => {
if (x < max && sumErr < -0.001) {
let maxAdd = max - x;
if (maxAdd > Math.abs(sumErr)) {
const toReturn = +(x + Math.abs(sumErr)).toFixed(1);
sumErr = 0;
return toReturn;
} else {
sumErr += maxAdd;
return max;
}
}
return x;
});
}
return arr.sort(() => Math.random() - 0.5);
}
getArr(10, 2.01, 0.5, 2.5); // [0.5, 3.8, 2.4, 3.4, 0.5, 3.8, 0.6, 0.5, 0.7, 3.9]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment