JSFiddle - React, Tailwind, and code Playground

by Prathameshsb

CSS

* {
  background-color: #232323;
}

JavaScript

function rollDice(probabilities) {
  const sortedProbabilities = Object.entries(probabilities).sort(
    (a, b) => a[1] - b[1]
  );

  const cumulativeProbabilities = sortedProbabilities.reduce(
    (acc, [dice, prob]) => {
      const prevCumulative = acc.length > 0 ? acc[acc.length - 1][1] : 0;
      return [...acc, [dice, prevCumulative + prob]];
    },
    []
  );

  const randomNum = Math.random();
  
  let left = 0;
  let right = cumulativeProbabilities.length - 1;

  while (left < right) {
    const mid = Math.floor((left + right) / 2);
    if (cumulativeProbabilities[mid][1] < randomNum) {
      left = mid + 1;
    } else {
      right = mid;
    }
  }

  return parseInt(cumulativeProbabilities[left][0]);
}

const diceProbabilities = {
  '1': 0.1,
  '2': 0.2,
  '3': 0.15,
  '4': 0.15,
  '5': 0.2,
  '6': 0.2,
};

const result = rollDice(diceProbabilities);
console.log(result);