dimanche 8 juillet 2018

Generate an array of unique N random numbers which if all numbers summed up equal to N

Assume that N = 3, I want to make a function to generate 3 unique random numbers which if all numbers summed up will equal to 3. For example:

numbers = [1, 0, 2]
numbers = [2, -4, 1]

I already have my own solution in JavaScript below:

let i = 0;
let arr = []

function getRandomInt(number) {
  return Math.floor(Math.random()*(number*2)) - number;
}

function generateArray(i, arr, number) {
  let lastIndex = number-1;

  while (i < lastIndex) {
    let randomNumber = getRandomInt(number);
    if (arr.indexOf(randomNumber) > -1) {
      continue;
    } else {
      arr[i] = randomNumber;
    }
    i++;
  }

  let summed = arr.reduce((a, b) => a+b);
  let lastNumber = number - summed;
  if (arr.indexOf(lastNumber) > -1) {
    return generateArray(lastIndex-1, arr, number);
  } else {
    arr[lastIndex] = lastNumber;
    return arr;
  }
}

But I still have a problem with the last index that tends to deviate quite a lot. For example with N = 10, I could have a result like this one below:

numbers = [2, -1, 3, 4, -4, 0, -5, -8, -6, 15] 

I wonder if you guys have a much better solution with also a better performance. Thank you!




Aucun commentaire:

Enregistrer un commentaire