Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- output:
- {
- 0.50 old: 33.333333333333336,
- 0.55 old: 39.032258064516135,
- 0.60 old: 45,
- 0.50 new: 38,
- 0.55 new: 42.56189807774788,
- 0.60 new: 47.1638141809291,
- 0.50 better new: 38.888888888888886,
- 0.55 better new: 43.407629887237846,
- 0.60 better new: 47.94212218649518,
- }
- */
- const oldOutcomes = {
- ww: 200,
- wl: 0,
- l: 0,
- };
- const newOutcomes = {
- www: 250, // 3 wins
- wwlw: 250,
- wlww: 250,
- lwww: 250,
- wwll: 150, // 2 wins
- wlwl: 150,
- lwwl: 150,
- wll: 50, // 1 win
- lwl: 50,
- ll: 0, // 0 wins
- };
- const betterNewOutcomes = {
- www: 250, // 3 wins
- wwlw: 250,
- wlww: 250,
- wwll: 150, // 2 wins
- wlwl: 150,
- wll: 50, // 1 win
- l: 0, // 0 wins
- };
- function averagePrizePerGame (outcomes, winProb) {
- for (const [gameRecord, prize] of Object.entries(outcomes)) {
- let wins = 0;
- let losses = 0;
- for (const g of gameRecord) {
- switch (g) {
- case "w": wins++; break;
- case "l": losses++; break;
- default: throw new Error(`Unknown game result: ${g}`);
- }
- }
- const probability = Math.pow(winProb, wins) * Math.pow(1 - winProb, losses);
- const length = gameRecord.length;
- outcomes[gameRecord] = {prize, probability, length};
- }
- const highestLength = Math.max( ...Object.values(outcomes).map( ({length}) => length ) );
- // averagePrizePerGame = SUM: probability * (prize + (highestLength - length) * averagePrizePerGame) / highestLength
- // = SUM: probability * prize / highestLength +
- // averagePrizePerGame * SUM: probability * (1 - length / highestLength)
- // <=> (1 - SUM: probability * (1 - length / highestLength)) * averagePrizePerGame = SUM: probability * prize / highestLength
- // <=> averagePrizePerGame = ( SUM: probability * prize / highestLength ) / ( 1 - SUM: probability * (1 - length / highestLength) )
- // = ( SUM: probability * prize ) / ( highestLength - SUM: probability * (highestLength - length) )
- const sum1 = Object.values(outcomes).reduce(
- (acc, {prize, probability, length}) => acc + probability * prize,
- 0
- );
- const sum2 = Object.values(outcomes).reduce(
- (acc, {prize, probability, length}) => acc + probability * (highestLength - length),
- 0
- );
- return sum1 / (highestLength - sum2);
- }
- return {
- "0.50 old": averagePrizePerGame({...oldOutcomes}, 0.5),
- "0.55 old": averagePrizePerGame({...oldOutcomes}, 0.55),
- "0.60 old": averagePrizePerGame({...oldOutcomes}, 0.6),
- "0.50 new": averagePrizePerGame({...newOutcomes}, 0.5),
- "0.55 new": averagePrizePerGame({...newOutcomes}, 0.55),
- "0.60 new": averagePrizePerGame({...newOutcomes}, 0.6),
- "0.50 better new": averagePrizePerGame({...betterNewOutcomes}, 0.5),
- "0.55 better new": averagePrizePerGame({...betterNewOutcomes}, 0.55),
- "0.60 better new": averagePrizePerGame({...betterNewOutcomes}, 0.6),
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement