"""Dice (roll-under 0-99.99): win chance vs payout, and USDT bankroll survival.""" import numpy as np from common import save SEED = 20261004 EDGE = 0.01 rng = np.random.default_rng(SEED) # 1. Payout table for every whole-number target, verified by 1M rolls each for a few targets table = [] for target in range(2, 99): p = target / 100 mult = (1 - EDGE) / p table.append({"target": target, "win_chance": round(p * 100, 2), "multiplier": round(mult, 4), "loss_per_100_bets_usdt_at_1": round(100 * EDGE, 2)}) N = 1_000_000 checks = [] for target in (10, 25, 49.5, 75, 90): rolls = rng.random(N) * 100 wins = rolls < target mult = (1 - EDGE) / (target / 100) ret = (wins * mult).mean() checks.append({"target": target, "rounds": N, "observed_win_pct": round(wins.mean() * 100, 3), "observed_rtp_pct": round(ret * 100, 3), "theoretical_rtp_pct": 99.0}) # 2. "How long does 100 USDT last?" 1 USDT flat bets, stop at 0 or 200, cap 10,000 bets SESS = 20_000 CAP = 10_000 survival = [] for target in (10, 49.5, 90): p = target / 100 mult = (1 - EDGE) / p win_amt = mult - 1 bank = np.full(SESS, 100.0) alive = np.ones(SESS, bool) doubled = np.zeros(SESS, bool) bets = np.zeros(SESS, int) for i in range(CAP): idx = alive if not idx.any(): break w = rng.random(idx.sum()) < p bank[idx] += np.where(w, win_amt, -1.0) bets[idx] += 1 busted = bank < 1 hit = bank >= 200 doubled |= hit & alive alive &= ~busted & ~hit survival.append({"target": target, "multiplier": round(mult, 4), "sessions": SESS, "chance_double_pct": round(doubled.mean() * 100, 2), "chance_bust_pct": round((bank < 1).mean() * 100, 2), "median_bets": int(np.median(bets)), "still_playing_after_cap_pct": round(alive.mean() * 100, 2)}) save("dice", {"game": "Dice (roll under)", "house_edge": EDGE, "rounds_check": N, "sessions": SESS, "bankroll_usdt": 100, "bet_usdt": 1, "stop_rules": "bust or reach 200 USDT, max 10,000 bets", "seed": SEED, "script": "dice_sim.py"}, {"table": table, "checks": checks, "survival": survival}, [[r["target"], r["win_chance"], r["multiplier"]] for r in table], ["target", "win_chance_pct", "multiplier_1pct_edge"])