Post
Topic
Board Gambling
Re: A delightfully simple spin-the-wheel game (that's provably fair)
by
dooglus
on 14/11/2012, 21:57:25 UTC
According to some simulations I've run, the house edge for this game is around 4%:

average return over 20000 games is 0.965675
average return over 20000 games is 0.951625
average return over 20000 games is 0.961850
average return over 100000 games is 0.960370

Code:
#!/usr/bin/env python

import MersenneTwister19937

import random, string

class KingCoin:
    def __init__(self):
        seed = random.randint(0, 2**60)
        self.mt = MersenneTwister19937.MersenneTwister19937(seed)

        self.FOUR_DIFFERENT = 3 # 4 different colors in 4 spins
        self.SIX_SPINS = 2.5 # 6 spins, any color
        self.THREE_IN_ROW = 2 # 3 in a row
        self.THREE_OF_FIVE = 1.5 # 3 out of 5 (needs 5 non-black spins to pay)
        self.LOSE = 0 # spinning black = lose

    def play_once(self):
        wheel = '1'*3 + '0'*450
        wheel = [150] + map(lambda x: len(x)+100, string.split(self.mt.shuffle_string(wheel), '1'))
        n = 0
        spots = []
        for c in wheel:
            spots += c*[n]
            if (n == 0):
                n += 1
            else:
                n *= 2

        self.spots = self.mt.shuffle(spots)[:6]
        s0, s1, s2, s3, s4, s5 = self.spots

        # 3 spins
        if s0==0 or s1==0 or s2==0: return self.LOSE
        if s0==s1 and s1==s2: return self.THREE_IN_ROW

        # 4 spins
        if s3==0: return self.LOSE
        if s0+s1+s2+s3 == 15: return self.FOUR_DIFFERENT
        if s1==s2 and s2==s3: return self.THREE_IN_ROW

        # 5 spins
        if s4==0: return self.LOSE
        if s1+s2+s3+s4 == 15: return self.FOUR_DIFFERENT
        if s2==s3 and s3==s4: return self.THREE_IN_ROW
        c = {}
        for i in self.spots[0:5]:
            if c.has_key(i):
                c[i] += 1
                if c[i] == 3: return self.THREE_OF_FIVE
            else:
                c[i] = 1

        # 6 spins
        if s5==0: return self.LOSE
        if s2+s3+s4+s5 == 15: return self.FOUR_DIFFERENT
        else: return self.SIX_SPINS

k = KingCoin()

spins = 100000
sum = 0.0
for i in range(spins):
    sum += k.play_once()

print "average return over %d spins is %f" % (spins, sum / spins)