mc_randomSplit_10M_100K

Benchmark created on


Description

todo написати функцію будь-якою мовою програмування, яка приймає два параметри — суму S та кількість N, і повертає масив із N випадкових чисел, що у сумі дорівнюють S.

Наприклад: S = 100, N = 3 => [25, 54, 21] S = 100, N = 3 => [4, 23, 73] S = 100, N = 5 => [14, 33, 9, 12, 32]

Setup

const Total = 10_000_000;
const Count = 100_000;

Test runner

Ready to run.

Testing in
TestOps/sec
Yura
function randomSplit(total, count) {
  console.assert(count > 0, 'Count must be greater than zero.')
  console.assert(total > 0, 'Total must be greater than zero.')

  const numbers = Array.from({ length: count }, (_, i) => Math.random())
  const sum = numbers.reduce((acc, num) => acc + num, 0)

  const result = numbers.map((num) => Math.floor((num / sum) * total))
  const currentSum = result.reduce((acc, num) => acc + num, 0)

  // Adjust the first element to ensure the sum equals total
  result[0] += total - currentSum

  return result
}

randomSplit(Total, Count);
ready
Yura_byAkaLexUA
function randomSplit(total, count) {
  console.assert(count > 0, 'Count must be greater than zero.')
  console.assert(total > 0, 'Total must be greater than zero.')

  const numbers = Array.from({ length: count }, (_, i) => Math.random())
  const sum = numbers.reduce((acc, num) => acc + num, 0)

  const scaleFactor = total / sum;
  const result = numbers.map((num) => Math.floor(num * scaleFactor))
  const currentSum = result.reduce((acc, num) => acc + num, 0)

  // Adjust the first element to ensure the sum equals total
  result[0] += total - currentSum

  return result
}

randomSplit(Total, Count);
ready
Yura_byMC_v1
function randomSplit(total, count) {
  console.assert(count > 0, 'Count must be greater than zero.')
  console.assert(total > 0, 'Total must be greater than zero.')

  let sum = 0;
  const numbers = Array.from({ length: count }, (_, i) => {
    const val = Math.random();
    sum += val;
    return val;
  });

  const scaleFactor = total / sum;
  let currentSum = 0;
  const result = numbers.map((num) => {
    const val = Math.floor(num * scaleFactor);
    currentSum += val;
    return val;
    
  })

  // Adjust the first element to ensure the sum equals total
  result[0] += total - currentSum;

  return result;
}

randomSplit(Total, Count);
ready
Yura_byMC_v2
function randomSplit(total, count) {
  console.assert(count > 0, 'Count must be greater than zero.')
  console.assert(total > 0, 'Total must be greater than zero.')

  let sum = 0;
  const numbers = new Array(count);
  for (let i = 0; i < count; i++) {
    numbers[i] = Math.random();
    sum += numbers[i];
  }

  const scaleFactor = total / sum;
  
  let currentSum = 0;
  const result = new Array(count);
  for (let i = 0; i < count; i++) {
    result[i] = Math.floor(numbers[i] * scaleFactor);
    currentSum += result[i];
  }

  // Adjust the first element to ensure the sum equals total
  result[0] += total - currentSum;

  return result;
}

randomSplit(Total, Count);
ready
Yura_byMC_v3
function randomSplit(total, count) {
  console.assert(count > 0, 'Count must be greater than zero.')
  console.assert(total > 0, 'Total must be greater than zero.')

  let sum = 0;
  const numbers = new Array(count);
  for (let i = 0; i < count; i++) {
    numbers[i] = Math.random();
    sum += numbers[i];
  }

  const scaleFactor = total / sum;
  
  let currentSum = 0;
  const result = new Array(count);
  numbers.forEach((num, ind) => {
    result[ind] = Math.floor(num * scaleFactor);
    currentSum += result[ind];
  });

  // Adjust the first element to ensure the sum equals total
  result[0] += total - currentSum;

  return result;
}

randomSplit(Total, Count);
ready
AkaLexUA_v2
function randomSplit(S, N) {
  if (N <= 0) {
    throw new Error("Count must be greater than zero.");
  }
  
  if (S <= 0) {
    throw new Error("Total must be greater than zero.");
  }
  
  // Генеруємо масив випадкових чисел
  const randoms = Array.from({ length: N }, () => Math.random());
  
  const randomSum = randoms.reduce((sum, val) => sum + val, 0);
  const scaleFactor = S / randomSum;
  
  // Масив результатів (цілі числа після масштабування)
  let result = randoms.map(r => Math.floor(r * scaleFactor));
  
  const currentSum = result.reduce((sum, val) => sum + val, 0);
  result[0] += S - currentSum;
  
  return result;
}

randomSplit(Total, Count);
ready
AkaLexUA_v3_Manual
function randomSplit(S, N) {
  if (N <= 0) {
    throw new Error("Count must be greater than zero.");
  }

  if (S <= 0) {
    throw new Error("Total must be greater than zero.");
  }

  let randoms = new Array(N);
  for (let i = 0; i < N; i++) {
    randoms[i] = Math.random();
  }

  const randomSum = randoms.reduce((sum, val) => sum + val, 0);
  const scaleFactor = S / randomSum;

  let result = new Array(N);
  for (let i = 0; i < N; i++) {
    result[i] = Math.floor(randoms[i] * scaleFactor);
  }

  const currentSum = result.reduce((sum, val) => sum + val, 0);
  result[0] += S - currentSum;

  return result;
}

randomSplit(Total, Count);
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.