JSFiddle - React, Tailwind, and code Playground

by Prathameshsb

JavaScript

// Function to roll a biased die based on given probabilities
const rollDice = (probabilities) => {
  // Step 1: Normalize Probabilities
  const normalizedProbabilities = normalizeProbabilities(probabilities);

  // Step 2: Create Cumulative Probabilities Array
  const cumulativeProbabilities = createCumulativeProbabilities(normalizedProbabilities);

  // Step 3: Generate Random Number
  const rand = Math.random();

  // Step 4: Find Outcome
  return findOutcome(rand, cumulativeProbabilities);
};

// Helper function to normalize probabilities
const normalizeProbabilities = (probabilities) => {
  const sum = Object.values(probabilities).reduce((acc, prob) => acc + prob, 0);

  // If sum is not exactly 1, normalize probabilities
  if (sum !== 1) {
    return Object.fromEntries(
      Object.entries(probabilities).map(([key, prob]) => [key, prob / sum])
    );
  }

  return probabilities;
};

// Helper function to create cumulative probabilities array
const createCumulativeProbabilities = (probabilities) => {
  let cumulativeProb = 0;
  return Object.values(probabilities).map((prob) => (cumulativeProb += prob));
};

// Helper function to find outcome based on random number
const findOutcome = (rand, cumulativeProbabilities) => {
  for (let i = 0; i < cumulativeProbabilities.length; i++) {
    if (i === 0 && rand <= cumulativeProbabilities[i]) {
      return Object.keys(probabilities)[i];
    } else if (rand > cumulativeProbabilities[i - 1] && rand <= cumulativeProbabilities[i]) {
      return Object.keys(probabilities)[i];
    }
  }
};

// Example usage
const probabilities = {
  '1': 0.1,
  '2': 0.2,
  '3': 0.3,
  '4': 0.15,
  '5': 0.1,
  '6': 0.15,
};

const result = rollDice(probabilities);
console.log(result); // Output: One of the dice outcomes based on probabilities