Average profits and losses on a roulette table

In summary, the conversation discussed a youtube video that suggested a betting theory for roulette where the player starts with a small bet and doubles up each time they lose until they win. The main idea is to bet on 50-50 odds and start over with a small bet after each win. The conversation also touched on the concept of martingale strategies and how they do not guarantee a win. One participant proposed a 2-player strategy where they alternate betting on red and black, but it was pointed out that the 0 and 00 on the roulette wheel would still result in a loss for both players. The conversation also mentioned a book called "Fortunes Formula" which discusses a different strategy for gambling. Finally, there was a discussion about
  • #1
BiGyElLoWhAt
Gold Member
1,622
131
Recently, youtube suggested a video to me on roulette betting theory. The essence of the idea:
Start with a small bet. If you win, bet the same, if you lose, double up. If you lose a second time, double again (or bet the sum of your previous bets) until you win. Start over at the small bet. The important part is to bet on 5050 odds.
Example:
Bet $1 -lose (-$1)
Bet $2-win (+$1)
Bet $1- win(+$2)
Bet $1- lose (+$1)
Bet $2 -lose (-$1)
Bet $3 -lose (-$4)
Bet $6 - win (+$2)
Etc.
So with $192, you have to lose 8 times in a row to be bankrupt, which has a 1 in 256 chance.
Now if I played this for 2 people, one on black and red, we should essentially win everytime.
My question, as a function of the number of spins, how much money should we win on average? I'm not even sure how to go about figuring this out, my probability theory sucks. I would really like help in figuring this out. Answers are fine, but only with explanations.

To clarify, I have a partner. I bet red using this method, my partner bets black using this method.
Bet 1 black bet 1 red - roll red (+0)
Bet 2 black bet 1 red - roll black (+1)
Bet 1 black bet 2 red - roll black (+0)
Bet 1 black bet 3 red - roll red (+2)
Bet 2 black bet 1 red... etc.
Obviously assume a fair board, no wears, balanced and level. 50 50 odds for either roll. Bets are 1,2,3,6,12,24,48,96,etc. For the sake of argument, let's say you are bankrupt if you lose the 96 bet (thats the 8 bets with $192 bank).
 
Physics news on Phys.org
  • #2
You will win no money at all on average. It is a common fallacy to believe this. Your assumption is that you have an infinite amount of money to bet, but this is not the case.

In addition, the roulette wheel does not give you 50-50 odds by construction. The 0 is added to benefit the house, which effectively means that every time you make a bet you should expect a deficit.
 
  • Like
Likes CWatters
  • #3
The original strategy here, I believe is a martingale strategy. Martingales mean something a bit more than that in modern probability, but this betting 'strategy' is the origin.

The 2 player proposal is quite nice because it simplifies things. You're basically running a Dutch book to guaranty that you and a friend lose (i.e. gain nothing on almost all spins and lose on the residuals linked to zero).
 
  • #4
Ahh there's a 0? How many numbers are on the wheel?
 
  • #5
BiGyElLoWhAt said:
Ahh there's a 0? How many numbers are on the wheel?

Use Google. I think even Dostoevsky's The Gambler would give you this.
 
  • #6
I don't see how we gain nothing on all spins. If it alternates red black, we are plus 1 on each alternation (after the first bet where it's net even). We of course lose on the zero.
 
  • #7
In american roulett, it seems there is zero and 00. So there are 38 numbers, 2 of which are zeros. 1 in 19 spins on average is a loss for both, 9/19 red wins 9/19 black wins.

After looking at some cases (assuming no zeros) as long as we both stop after one of us "wins big", we always come out ahead. I am going to make a spreadsheet, but I venture to say that you can still win with zeros. I may very well be wrong. I will post my sheet later.
 
  • #9
Hmmm, that seems odd. You never recoup your losses except with an appropriately sized winning streak. If you double, you recoup all losses on the next win.
 
  • #10
So I didn't make a spreadsheet, I made a python script. Other than the occasional error (out of bounds), it seems to be between 60 and 70 dollars profit each time. I had one that was 37. If it hits out of bounds, it's a bust. I thought I took care of it, but apparently not.
Python:
"""
Created on Wed Jan 03 00:44:52 2018

@author: Tyler
"""
from random import randint
numbers = 38
pb = 0 #profit black
pr = 0 #profit red
pn = 0 #profit net
br = 0 #red bet index
bb = 0 #black bet index
games = 100
bets = [1,2,3,6,12,24,48,96]

for i in range(games):
    spin = randint(0,37)
    if spin < 2: # 0 or 00
        pb -= bets[bb]
        bb += 1
        pr -= bets[br]
        br +=1
    elif spin-2 <18: #black wins
        pb += bets[bb]
        bb = 0
        pr -= bets[br]
        br += 1
        leave = randint(0,19)
        if leave < 10 and bb >2 and br ==0:
            print i
            i = games
    else: #red wins
        pb -= bets[bb]
        bb += 1
        pr += bets[br]
        br = 0
        leave = randint(0,19)
        if leave < 10 and br >2 and bb ==0:
            print i
            i = games
    if br >= 7 or bb >= 7: #bust
        print i
        i = games
   
    pn = pr + pb
print pn

Basically I use rand ints between 0 and 37 (since there are 38 options on the table). 0 and 1 represent 0 and 00. 2-19 represent black and 20-37 are red. The distribution is a bit off, but with enough takes, this won't matter. Can anyone point out where I'm not catching my index out of bounds? I'm thinking that last if statement should catch it. Actually I should be able to be >= 8, since there is 0-7 in my array. My pc is garbo otherwise I would just debug (took me 10 mins just to save =/)
 
  • #11
Python rand numbers are pseudo random meaning they won’t reflect reality so be prepared to be surprised.
 
Last edited:
  • #12
how can i generate "more random" numbers?
 
  • #14
jedishrfu said:
I’ve heard the best strategy is to never double your bet but instead halve it. I remember reading about it in this book Fortunes Formula. In that way, you can control your losses with a slight chance of winning.

https://www.amazon.com/dp/0809045990/?tag=pfamazon01-20

It's a good book with a nice background on Shannon and Ed Thorp.

The Edge Over Odds formula in that book is derived from entropy concerns, but its really just geometric mean optimization in a binary case. If you have no edge, then don't bet, says the formula. (Put differently, when optimizing a geometric mean, we can immediately see to not bet if the edge is negative.) OP's martingale proposal still has no edge.

People can read more about Thorp and his views on gambling directly on his website. Note: Thorp has at least 9 articles on roullete on this webpage

http://www.edwardothorp.com/articles/

From "SystemsForRoulette_l.pdf", found on that link.

The doubline-up system... to see how ridiculous the system would be... Is this system any good

and the answer is no and he proves other 'systems' with negative expectation are bad too. Read the articles for more discussion.

jedishrfu said:
Python rand numbers are pseudo random meaning they won’t reflect reality so be prepared to be surprised.

It's been a while but last I heard, if users aren't concerned about cryptographic randomness, then Python's rand generator should be 'close enough' for any other purpose, as long as they aren't being seeded. Numpy's random number generators are generally preferred though.
 
  • Like
Likes jedishrfu and BiGyElLoWhAt
  • #15
jedishrfu said:
I’ve heard the best strategy is to never double your bet but instead halve it. I remember reading about it in this book Fortunes Formula. In that way, you can control your losses with a slight chance of winning.

https://www.amazon.com/dp/0809045990/?tag=pfamazon01-20
The best strategy is to not play since the expectation value is negative.
 
  • Like
Likes CWatters and jedishrfu
  • #16
As well as the zero (or zeroes for US wheel), the Martingdale strategy won't work even if you did have an infinite amount of money, as the casinos will not allow such big bets. Typically, casinos limit these single bets to around £10,000 on a high stakes table...
If you're looking for 50/50 chance, choose baccarat - bet on the Banker for a 1.06% edge.
 
  • #17
Erik Cox said:
As well as the zero (or zeroes for US wheel), the Martingdale strategy won't work even if you did have an infinite amount of money, as the casinos will not allow such big bets. Typically, casinos limit these single bets to around £10,000 on a high stakes table...
If you're looking for 50/50 chance, choose baccarat - bet on the Banker for a 1.06% edge.
Indeed, the only casino games where you could theoretically carry a positive EV are games where you are betting against other players and not the house or games where the player edge is small enough and proper strategy rare enough that the actual edge based on the strategy used by the average player lies with the house. Otherwise the casinos would not offer those games.

A prime example where you can carry a positive EV is poker if you are (more) skilled at it (than your opponents). I made around $5000 on online poker as a diversion during the latter part of my PhD playing mostly at quite low stakes. The house still gains by taking a part of each pot (without even risking losses).
 
  • #18
Someone should change the thread title to average losses.
 
  • #19
BiGyElLoWhAt said:
So I didn't make a spreadsheet, I made a python script. Other than the occasional error (out of bounds), it seems to be between 60 and 70 dollars profit each time. I had one that was 37. If it hits out of bounds, it's a bust. I thought I took care of it, but apparently not.
[.

Basically I use rand ints between 0 and 37 (since there are 38 options on the table). 0 and 1 represent 0 and 00. 2-19 represent black and 20-37 are red. The distribution is a bit off, but with enough takes, this won't matter. Can anyone point out where I'm not catching my index out of bounds? I'm thinking that last if statement should catch it. Actually I should be able to be >= 8, since there is 0-7 in my array. My pc is garbo otherwise I would just debug (took me 10 mins just to save =/)

The problem with your code is your horrible way of breaking out of the for loop bij setting i = games. This is NOT the way to do it, and often seems not to work at all. I don't know if python can also have demons fly out of your nose when doing something like that. . You can just use a break statement instead of i = games.
(Only the last break will actually work BTW, the if leave < 10 and bb >2 and br ==0: tests will never succeed.)

Unfortunately these are all cases where one of the players goes bust. This happens quite often, one of the players will be at about -90, and the other will be at about +30.
After repeating the entire game of maximum 100 rounds 10000 times, it appears the expected value for playing a maximum of hundred rounds and stopping when the red or the black player is bust, is about -10.
 
  • Like
Likes BiGyElLoWhAt
  • #20
Ahh thanks for that catch. I don't really use python that much, but eclipse takes too long to load on this computer.
 
  • #21
Here is my modified code:
Code:
# -*- coding: utf-8 -*-
"""
Created on Wed Jan 03 00:44:52 2018

@author: Tyler
"""
from random import randint
numbers = 38
pb = 0 #profit black
pr = 0 #profit red
pn = 0 #profit net
br = 0 #red bet index
bb = 0 #black bet index
games = 100
cycles = 10000
bust = 0
bets = [1,2,3,6,12,24,48,96]

for i in range(cycles):
    pb = 0 #profit black
    pr = 0 #profit red
    pn = 0 #profit net
    br = 0 #red bet index
    bb = 0 #black bet index
    for i in range(games):
        spin = randint(0,37)
        if spin < 2: # 0 or 00
            pb -= bets[bb]
            bb += 1
            pr -= bets[br]
            br +=1
        elif spin-2 <18: #black wins
            pb += bets[bb]
            bb = 0
            pr -= bets[br]
            br += 1
            leave = randint(0,19)
            if leave < 10 and bb >2 and br <2:
                #print i
                break
        else: #red wins
            pb -= bets[bb]
            bb += 1
            pr += bets[br]
            br = 0
            leave = randint(0,19)
            if leave < 10 and br >2 and bb <2:
                #print i
                break
        if br >= 7 or bb >= 7: #bust
            bust+=1
            break
       
        pn += pr + pb
print "average profits: "
print pn/cycles
print "with"
print bust
print "busts"

if you change cycles to 1000 instead of 10,000, it still seems to lean slightly positive, like 1 or 2 dollars, however, on 10,000 it sits pretty close to zero.
Thanks for pointing out the flaws in my code.
I also "fixed" the lines with the "leave" statement, so there is a 50-50 chance that if one player wins big (to recoup losses) and the other player is on their first loss, that we both leave.
 
  • #22
Whats really interesting, if you change games to 1000, you get almost 100% bust rate. (games is the number of allotted spins) At 100, it sits right around 66%, with 50 you get around 40%. The standard deviation on this seems quite low, as well, just from rerunning the program and eyeballing it.

Edit:
As expected, adding 1 additional bet term changes the bust rate by a factor of 2 (probably closer to 17/36, if I'm thinking about this correctly).
 
  • #23
Is this part of the randomness issue? Slight variation to the code, I added in the next bet, we play at most 100 rounds, and 1000 cycles. This steadily climbs. The EV seems to be between 2 and 3. I just ran about 20 or 30 and totaled them by hand. Highest was +3, lowest was -1, and the total was around +67.
 
  • #24
Hmmm... Someone might need to explain where I'm going wrong in my assumptions here, or where my coding error is.
I just reworked the code again. 1 game of roulette every night for a year (365 cycles). I assumed 2 minutes per spin, and a maximum of 4 hours per night, so 120 spins max. It's consistently coming out at around +4000 per year or so.
Python:
# -*- coding: utf-8 -*-
"""
Created on Wed Jan 03 00:44:52 2018

@author: Tyler
"""
from random import randint
from numpy import zeros
numbers = 38
pb = 0 #profit black
pr = 0 #profit red
pn = 0 #profit net
br = 0 #red bet index
bb = 0 #black bet index
games = 120
cycles = 365
rounds = 0
bust = 0
bets = [1,2,3,6,12,24,48,96,192,384]
roundsarr = zeros(cycles)

for i in range(cycles):
 
    pb = 0 #profit black
    pr = 0 #profit red
    pn = 0 #profit net
    br = 0 #red bet index
    bb = 0 #black bet index
    rounds = 0
    while(1):
        spin = randint(0,37)
        rounds +=1
        if spin < 2: # 0 or 00
            pb -= bets[bb]
            bb += 1
            pr -= bets[br]
            br +=1
        elif spin-2 <18: #black wins
            pb += bets[bb]
            bb = 0
            pr -= bets[br]
            br += 1
            leave = randint(0,19)
            if leave < 10 and bb >2 and br <2:
                #print i
                roundsarr[i] = rounds
                break
        else: #red wins
            pb -= bets[bb]
            bb += 1
            pr += bets[br]
            br = 0
            leave = randint(0,19)
            if leave < 10 and br >2 and bb <2:
                #print i
                roundsarr[i] = rounds
                break
        if br >= len(bets)-1 or bb >= len(bets)-1: #bust
            bust+=1
            roundsarr[i] = rounds
            break
     
        pn += pr + pb

roundsmax = 0
roundsavg = 0
for i in range(len(roundsarr)):
    roundsavg += roundsarr[i]
    if roundsarr[i] > roundsmax:
        roundsmax = roundsarr[i]
roundsavg = roundsavg/len(roundsarr)
print "average profits: "
print pn/cycles
print "total profits"
print pn
print "with"
print bust
print "busts"
print "average game length"
print roundsavg
print "longest game"
print roundsmax

Here in a bit I will try to make this more realistic. I'm still using 50-50 chance to see if we walk away on a big win, instead of forcing us to walk away on a big win, and the average length of the games are coming out to be 14-16. So I can lengthen the games, and force us to always walk away on a win, with high probability, by scaling the random chance of leaving to approach 100% as the night gets closer to an end. Every year I have run with this has been profitable, though. (one year turned a 47 dollar annual profit, which is the lowest I've seen.)

Edit:
I just made this change, and it didn't change hardly anything, which means that it's not the random factor, it's more likely the 33% bust rate that's causing the low length average games.
 
  • #25
Why are you even trying to simulate this? The maths are trivial. You cannot make a +EV strategy composed of a series of bets with non-positive EV.

Any simulation that tells you otherwise has either too few repetitions or issues with the random numbers.
 
  • Like
Likes jim mcnamara
  • #26
The "strategy" leads to a high probability to win a little bit and a small probability to lose all. If you don't run the simulation often enough you'll miss the second case and get an incorrect result.

Expectation values add. If you use 50/50 chances your expectation value is exactly zero in every game, therefore the overall expectation value is 0 as well. If you use realistic chances including 0 (or 0 and 00), your expectation value is negative in every game, therefore the overall expectation value is negative as well.
 
  • Like
Likes BiGyElLoWhAt
  • #27
Yea it's really weird though. I'm actually wondering where my simulation went wrong. If I lose, the losses are always bigger than the profits, however, it seems I'm winning 2/3 games (coming out ahead). And averaging over a year gives a net profit. I'm using between 8 and 120 rolls per game, and 365 games per simulation. I know the sample isn't huge, but it's not negligably small. The years that are losses are very small, at most like 300 or so. The gain years (which are far more abundant with these numbers) are averaging what looks like 4500. I include 0 and 00. Here is my current code. I keep track of the number of nights that are wins and losses, the biggest win, the biggest loss, the average gain/loss (+/-) the average number of spins per game, the longest game, etc.
Python:
# -*- coding: utf-8 -*-
"""
Created on Wed Jan 03 00:44:52 2018

@author: Tyler
"""
from numpy.random import randint
from numpy import zeros
numbers = 38
pb = 0 #profit black
pr = 0 #profit red
pn = 0 #profit net
br = 0 #red bet index
bb = 0 #black bet index
games = 120
cycles = 365
rounds = 0
bust = 0
bets = [1,2,3,6,12,24,48,96,192,384]
roundsarr = zeros(cycles)
big =0
small = 0
win = 0
loss = 0

for i in range(cycles):
   
    pb = 0 #profit black
    pr = 0 #profit red
    pn = 0 #profit net
    br = 0 #red bet index
    bb = 0 #black bet index
    rounds = 0
    for j in range(games):
        spin = randint(0,37)
        rounds +=1
        if spin < 2: # 0 or 00
            pb -= bets[bb]
            bb += 1
            pr -= bets[br]
            br +=1
        elif spin-2 <18: #black wins
            pb += bets[bb]
            bb = 0
            pr -= bets[br]
            br += 1
            leave = randint(0,games -1)
            if leave < j and bb >2 and br <2:
                #print i
                roundsarr[i] = rounds
                break
        else: #red wins
            pb -= bets[bb]
            bb += 1
            pr += bets[br]
            br = 0
            leave = randint(0,games -1)
            if leave < j and br >2 and bb <2:
                #print i
                roundsarr[i] = rounds
                break
        if br >= len(bets)-1 or bb >= len(bets)-1: #bust
            bust+=1
            roundsarr[i] = rounds
            break
           
        pn += pr + pb
    if pr + pb > big:
        big = pr + pb
    elif pr +pb < small:
        small = pr + pb
    if pr + pb > 0:
        win += 1           
    elif pr + pb < 0:
        loss += 1

roundsmax = 0
roundsavg = 0
for i in range(len(roundsarr)):
    roundsavg += roundsarr[i]
    if roundsarr[i] > roundsmax:
        roundsmax = roundsarr[i]
roundsavg = roundsavg/len(roundsarr)
print "average profits: "
print pn/cycles
print "total profits"
print pn
print "with"
print bust
print "busts"
print "average game length"
print roundsavg
print "longest game"
print roundsmax
print "high/low"
print big
print small
print "win/loss"
print win
print loss
So far (30 or so rolls in) on some free online roulette, I'm up by about 12 wins worth. I am up 38 bucks, but I started off with 1,2,3 and switched to 10,20,30.
 
  • #28
BiGyElLoWhAt said:
I know the sample isn't huge, but it's not negligably small.
It is too small. Run it for 100,000 days and see what happens. If you still get a profit then something is wrong with the code.
 
  • #29
Also, including a partner is just a red herring. Without the zeros, all the partner does is to bet an amount that exactly negates your own bet. Your partner betting 1 on black and you 2 on red is exactly equivalent to you betting 1 on red for your common bankroll. Red would lead to +2-1=+1 and black to -2+1=-1.

The strategy is therefore exactly equivalent to a Martingale type strategy for your common roll.
 
  • #30
.
BiGyElLoWhAt said:
pn += pr + pb

mfb said:
It is too small. Run it for 100,000 days and see what happens. If you still get a profit then something is wrong with the code.
There's another problem with the program, the line pn += pr + pb is indented too much, so it's in the inner loop and not in the outer loop, this means that the total winnings before one of the players goes bust get added to pn after each round. If you do it correctly, you'll see that most of the games, someone goes bust, and the total winnings are negative.
 
  • Like
Likes mfb, jim mcnamara and BiGyElLoWhAt
  • #31
Yea that seemed to be my problem. I was counting everything multiple times. So if I was 1 dollar ahead on spin 1 and 2 dollars ahead on spin 2, my profits were 3 dollars instead of 2 dollars. Thanks for pointing that out.
 
  • #32
Even if you are betting on a coin flip, the advantage lies with the side having more money. Say you start with $3 and are playing a house with $10,000. If you lose the first bet, and then bet $2 and lose again, you are done after 2 coin flips. If you win the second bet, you have $3 again, starting over. If you win the first bet, you are up to $4, and can follow your martingale for a $1 bet and a $2 double, and then are down to your last $1. If you win 4 flips in a row to start, you have $7 and could bet and lose a sequence of $1, $2, $4 and be wiped out. The house is only wiped out by a losing 10,000 bets more than it wins. The Martingale player is wiped out by a continuous losing streak.

There is a math treatment I could find for you, but the bottom line is that in an EVEN ODDS betting game, the side with the larger money reserve is less likely to lose a game to terminal bankruptcy. And of course, casino games are all NOT even odds, but favor the house.

Most games are not played to terminal bankruptcy. But a Martingale requires that the gambler treat his sequential losing bets with an exponential increase. And that is vulnerable to a losing streak, while the house is bullet-proof to the strategy. You only bet small amounts except when you lose. The house is ALWAYS playing with your money when you are doubling down. And eventually, you WILL have a losing streak that exceeds your pocket.

The average bettor loses money in casinoes. Some win a lot, some lose a lot, some win a little, some lose a little, some break even. But the odds are in the houses favor, and overall, the net is that the house wins a fraction more than it loses. There is no betting system to change that.
 
  • #33
votingmachine said:
Even if you are betting on a coin flip, the advantage lies with the side having more money.
Not if you consider the expectation value.
votingmachine said:
Say you start with $3 and are playing a house with $10,000. If you lose the first bet, and then bet $2 and lose again, you are done after 2 coin flips. If you win the second bet, you have $3 again, starting over.
If you win the second one you have $4.

If you play as long as both sides can pay, you have a 3/10003 chance to win everything and a 10000/10003 chance to lose everything. That shouldn't be surprising, and the expectation value is $3. A 50/50 chance for both players to win everything would mean your initial money doesn't matter and you could make a lot of money.
 
  • #34
While someone with infinite money would always win in a Martingale betting system, no one has infinite money. Also, the house always places limits on individual bets
 
  • #35
BWV said:
While someone with infinite money would always win in a Martingale betting system
Infinite money plus a dollar is still infinite money - the same amount.
 
  • Like
Likes StoneTemplePython

Similar threads

  • Set Theory, Logic, Probability, Statistics
Replies
2
Views
4K
Replies
11
Views
2K
  • Set Theory, Logic, Probability, Statistics
Replies
4
Views
1K
  • Set Theory, Logic, Probability, Statistics
Replies
7
Views
2K
  • Set Theory, Logic, Probability, Statistics
Replies
6
Views
2K
  • Set Theory, Logic, Probability, Statistics
Replies
9
Views
6K
  • Set Theory, Logic, Probability, Statistics
Replies
4
Views
3K
  • General Math
Replies
4
Views
733
  • Set Theory, Logic, Probability, Statistics
Replies
4
Views
2K
  • Set Theory, Logic, Probability, Statistics
Replies
5
Views
3K
Back
Top