def _ror(val, carry): next_carry = bool(val & 1) val = (val >> 1) if carry: val |= 0x80 return val, next_carry def random_init(): return [ 0x40 ] + ([ 0 ] * 12) def random_advance(seed): carry = bool((seed[0] & 0x02) ^ (seed[1] & 0x02)) for i in range(0, len(seed)): seed[i], carry = _ror(seed[i], carry) return seed def build_room(seed): v = 0xFF config = 6 while v > 0: if v < seed[1]: break config -= 1 v -= 0x2B start_offset = [ 0x02, 0x05, 0x08, 0x0B, 0xE, 0x11 ] layout_config = [ 0x00, 0x01, 0x02, 0x01, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x01, 0x02, 0x01, 0x00, 0x01, 0x00, 0x02 ] offset = start_offset[config] layout = layout_config[(offset - 2):(offset + 1)] prices = [ -10 if 0 == (seed[2] & 0x01) else -40, -10, 20 if 0 == (seed[2] & 0x02) else 50 ] final = [ prices[it] for it in layout ] return final seed = random_init() winnings = [ 0, 0, 0 ] for i in range(0, 100000): seed = random_advance(seed) room = build_room(seed) for i in range(0, 3): winnings[i] += room[i] print winnings