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