Casino Math Balancer
Mathematical framework for designing balanced, engaging betting mechanics with appropriate risk/reward curves.
Core Metrics
Return to Player (RTP)
RTP = (Total Amount Returned to Players / Total Amount Wagered) × 100
Target ranges by game type:
- Casual/Social: 95-98% RTP (player-friendly)
- Balanced: 92-95% RTP (sustainable)
- High-stakes: 88-92% RTP (house-favorable)
House Edge
House Edge = 100% - RTP
Example: RTP = 96% → House Edge = 4% For every 100 coins wagered, house keeps ~4 coins long-term
Variance Classification
Variance Hit Frequency Max Win Experience
Low
40% 2-10x Steady, small wins
Medium 20-40% 10-50x Balanced excitement
High <20% 50-500x Rare big wins
Meta-Pot System Math (Farming in Purria)
Pot Categories
Pot Probability Range Suggested RTP Notes
Water 45-65% success 96% Most stable
Sun 35-55% success 94% Medium variance
Pest 25-45% success 92% Higher risk/reward
Growth 15-35% success 90% Jackpot-style
Bet Level Calculations
interface BetCalculation { level: 'fold' | 'call' | 'all_in'; amount: number; multiplier: number; potentialWin: number; expectedValue: number; }
function calculateBet( coins: number, level: BetLevel, potSuccess: number, multiplier: number ): BetCalculation { const amounts = { fold: 0, call: Math.floor(coins * 0.1), all_in: coins };
const amount = amounts[level]; const potentialWin = Math.floor(amount * multiplier); const expectedValue = (potSuccess * potentialWin) - ((1 - potSuccess) * amount);
return { level, amount, multiplier, potentialWin, expectedValue }; }
Multiplier Balance Formula
Multiplier = (1 / Win_Probability) × RTP_Target
Example for 40% win rate at 94% RTP: Multiplier = (1 / 0.40) × 0.94 = 2.35x
Payout table:
- Call bet (10%): Win = 2.35x stake
- All-in: Win = 2.35x stake (same multiplier, higher stakes)
Probability Tables
Standard Template
| Outcome | Probability | Payout | Contribution to RTP |
|---|---|---|---|
| Win | P% | Mx | P × M |
| Push | Q% | 1x | Q × 1 |
| Lose | R% | 0x | 0 |
| TOTAL | 100% | - | RTP% |
Example: Meta-Pot Resolution
| Pot State | Probability | Payout | RTP Contribution |
|---|---|---|---|
| ≥80% | 15% | 3.0x | 45% |
| 50-79% | 35% | 1.8x | 63% |
| 20-49% | 30% | 0.5x | 15% |
| <20% | 20% | 0x | 0% |
| TOTAL | 100% | - | 123% → adjust |
Adjustment needed: Scale payouts by 0.94/1.23 = 0.764 New payouts: 2.29x, 1.38x, 0.38x, 0x → RTP ≈ 94%
Balancing Levers
Tuning Parameters
Lever Effect on Players Effect on Revenue
↑ Base win rate More engagement ↓ House edge
↑ Max multiplier Higher excitement Variance risk
↑ Tier thresholds Harder to win big ↑ House edge
↓ Bet minimums More accessibility ↓ Revenue per bet
Session Economy
Target metrics per session:
- Average session: 10-15 bets
- Net outcome: -5% to +20% of starting bankroll
- "Near miss" rate: 15-20% (engagement driver)
- Big win frequency: 1 in 20-50 sessions
Simulation Validation
Monte Carlo Template
function simulateSession( startingCoins: number, betsPerSession: number, betSize: number, winProb: number, winMultiplier: number ): SimulationResult { let coins = startingCoins; let wins = 0;
for (let i = 0; i < betsPerSession; i++) { coins -= betSize; if (Math.random() < winProb) { coins += betSize * winMultiplier; wins++; } }
return { finalCoins: coins, netChange: coins - startingCoins, winRate: wins / betsPerSession, rtp: (coins + (betsPerSession * betSize) - startingCoins) / (betsPerSession * betSize) }; }
// Run 10,000 sessions to validate RTP converges to target
Red Flags Checklist
Before shipping any betting mechanic:
-
RTP calculated and within target range
-
Variance classified and appropriate for audience
-
No exploitable patterns in RNG
-
Maximum loss per session capped
-
Win streaks don't exceed 5 without cooldown
-
Loss streaks trigger pity mechanics
-
Economy doesn't inflate over time
-
Math validated via simulation (10k+ runs)
Legal Considerations
For social casino / non-gambling:
-
No real-money conversion
-
Virtual currency clearly labeled
-
Odds disclosure recommended
-
Age-gating in place
-
"For entertainment only" messaging