@kur4chyt
Качественный говнокод от производителя

Как сделать, чтобы код не давал повторения?

кто знает, как можно сделать, чтобы этот код не добавлял повторения в массив?

function splitSum(sum, splits){
    let result = []; 
    let a = sum/splits
    for(let i = 0; i<splits; i++) {
    result[i] = i%2 ? Math.round( (a+(a/(i+3)))/10 )*10 : Math.round( (a-(a/(i+2)))/10) *10
    }; 
    var all_sum = 0;
    result.map(v => all_sum +=v)
    result[result.length - 1] += Math.round(all_sum - sum) 
    return result;
    }
console.log(splitSum(2000, 12)) /* [
   80, 210, 130, 190,
  140, 190, 150, 180,
  150, 180, 150, 110
]


кратко объясняю что мне нужно сделать:

Нужно поделить сумму определенное кол-во раз, нужно чтобы каждый результат деления был разный, и все это добавлялось в массив. И чтобы в общей сумме все эти числа из массива образовывали изначальное число, которое делили.

фух надеюсь правильно и понятно объяснил
  • Вопрос задан
  • 102 просмотра
Решения вопроса 1
RAX7
@RAX7
function splitSum(sum, splits) {
  const nums = [sum];

  while (nums.length !== splits) {
    const { val, idx } = nums.reduce(
      (a, v, i) => (v > a.val ? { idx: i, val: v } : a),
      { idx: -1, val: -Infinity }
    );

    /* // OR
    const idx = Math.floor(nums.length * Math.random());
    const val = nums[idx]; */

    let a, b;
    do {
      a = Math.round(val * Math.random());
      b = val - a;
    } while (a === b || nums.includes(a) || nums.includes(b));

    nums.splice(idx, 1, a, b);
  }

  return nums;
}

Использовать с осторожностью. Можно попасть в бесконечный цикл.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы