Thread Rating:
September 7th, 2012 at 11:30:30 PM
permalink
I wanted to answer the question(s):
1. If I played Deuces Wild Full Pay with optimal strategy, on average, how many plays would it take to earn 800 credits ($1000 playing 5 x $0.25), and how many to earn 8000 credits ($10,000, 5 x $0.25)?
2. What is the average amount of bankroll would you need to not bust out for these two scenarios?
I wrote a program to do this, Monte Carlo style, using the probability table from here (first table on the page):Basically, I'd generate a random number to represent each play, and use that to calculate a payoff.
The results were surprising, and I wanted to know whether they seem to be statistically accurate with what you would expect. Here they are:
This was over 1000 trials.
My code is below if you want to see it, or try it yourself (java). Note that it will just spit out the raw results, and you'll need to massage it using a spreadsheet or something first.
Anyway, this is far more trials than I expected, since 800 (profit objective) / 0.76 (average profit per play) = 1052.63 (total hands to win on average profit objective). Do these results make sense, or am I missing something (or have a bug in my code?)
1. If I played Deuces Wild Full Pay with optimal strategy, on average, how many plays would it take to earn 800 credits ($1000 playing 5 x $0.25), and how many to earn 8000 credits ($10,000, 5 x $0.25)?
2. What is the average amount of bankroll would you need to not bust out for these two scenarios?
I wrote a program to do this, Monte Carlo style, using the probability table from here (first table on the page):Basically, I'd generate a random number to represent each play, and use that to calculate a payoff.
The results were surprising, and I wanted to know whether they seem to be statistically accurate with what you would expect. Here they are:
Profit | Average plays | Average Needed Bankroll |
---|---|---|
800 credits | 121444.221 | 1011.42 credits |
8000 credits | 1065415.168 | 1475.317 credits |
This was over 1000 trials.
My code is below if you want to see it, or try it yourself (java). Note that it will just spit out the raw results, and you'll need to massage it using a spreadsheet or something first.
Anyway, this is far more trials than I expected, since 800 (profit objective) / 0.76 (average profit per play) = 1052.63 (total hands to win on average profit objective). Do these results make sense, or am I missing something (or have a bug in my code?)
import java.security.SecureRandom;
import java.util.ArrayList;
public class DeucesWild {
private static Chance [] chances =
new Chance [] { new Chance("Natural royal flush ",800 ,440202756l),
new Chance("Four deuces ",200 ,4060462824l),
new Chance("Wild royal flush ",25 ,35796957696l),
new Chance("Five of a kind ",15 ,63818309856l),
new Chance("Straight flush ",9 ,83087969280l),
new Chance("Four of a kind ",5 ,1294427430576l),
new Chance("Full house ",3 ,423165297240l),
new Chance("Flush ",2 ,334561280724l),
new Chance("Straight ",2 ,1117664265756l),
new Chance("Three of a kind ",1 ,5674784779512l),
new Chance("Nothing ",0 ,10901423560980l),
};
public static class Chance
{
String name;
int payoff;
long odds; //get it? :/
public Chance(String name, int payoff, long odds) {
super();
this.name = name;
this.payoff = payoff;
this.odds = odds;
}
}
private static final long TOTAL = 19933230517200l;
public static final int INITIAL_PLAYS = 0;
public static final int [] RECORDED_PROFITS = { 800, 8000 };
public static final int NUM_PLAYERS = 1000;
public ArrayList<Results> results = new ArrayList<Results>();
public static class Results
{
ArrayList<PlayStats> playStatsList = new ArrayList<PlayStats>(RECORDED_PROFITS.length);
public static void printCsvHeader() {
for(int i = 0; i < RECORDED_PROFITS.length; i++)
{
System.out.print(RECORDED_PROFITS+",");
PlayStats.printHeader();
if(i == RECORDED_PROFITS.length-1)
System.out.println();
else
System.out.print(",");
}
}
public void printCsv() {
for(int i = 0; i < RECORDED_PROFITS.length; i++)
{
System.out.print(RECORDED_PROFITS+",");
playStatsList.get(i).printCsv();
if(i == RECORDED_PROFITS.length-1)
System.out.println();
else
System.out.print(",");
}
}
public void add(PlayStats ps) {
playStatsList.add(ps);
}
}
public static class PlayStats
{
int numPlays;
int minBalance, maxBalance, endingBalance;
private int recordedProfitIndex;
public PlayStats(int recordedProfitIndex) {
this.recordedProfitIndex = recordedProfitIndex;
}
public static void printHeader() {
System.out.print("numPlays,minBalance, maxBalance, endingBalance");
}
public void printCsv() {
System.out.print(numPlays+","+minBalance+","+maxBalance+","+endingBalance);
}
public void update(int payoff) {
numPlays ++;
endingBalance += -1 + payoff;
minBalance = Math.min(minBalance,endingBalance);
maxBalance = Math.max(maxBalance,endingBalance);
}
public boolean isWinner() {
return endingBalance >= RECORDED_PROFITS[recordedProfitIndex];
}
public static PlayStats createNextPlayStats(PlayStats ps) {
if(ps.recordedProfitIndex == RECORDED_PROFITS.length -1)
return null; //end of the test
PlayStats newPs = new PlayStats(ps.recordedProfitIndex+1);
newPs.numPlays = ps.numPlays;
newPs.minBalance = ps.minBalance;
newPs.maxBalance = ps.maxBalance;
newPs.endingBalance = ps.endingBalance;
return newPs;
}
}
public static void main(String [] argv)
{
new DeucesWild().start();
}
public void start()
{
long calcTotal = 0;
for(Chance c: chances)
{
calcTotal += c.odds;
}
if(calcTotal != TOTAL)
{
throw new IllegalStateException("bad calcTotal, got "+calcTotal+", expected "+TOTAL);
}
Results.printCsvHeader();
for(int i = 0; i < NUM_PLAYERS; i++)
{
runUntilProfits().printCsv();
}
}
private Results runUntilProfits() {
Results r = new Results();
PlayStats ps = new PlayStats(0);
//first do the initial plays
for(int i = 0; i < INITIAL_PLAYS; i++)
{
ps.update(runPlay());
}
//now we start to save stats
for(;;)
{
if(ps.isWinner())
{
r.add(ps);
ps = PlayStats.createNextPlayStats(ps);
if(ps == null) // if we're at the end of recorded stats, then exit, we're done
break;
//continue to check if that one is also a winner
continue;
}
ps.update(runPlay());
}
return r;
}
private SecureRandom sr = new SecureRandom();
private int runPlay() {
long val = Math.abs(sr.nextLong()) % TOTAL;
for(Chance c : chances)
{
val -= c.odds;
if(val < 0)
return c.payoff;
}
throw new IllegalStateException("why did val run off the end? "+val);
}
}
September 7th, 2012 at 11:45:50 PM
permalink
Quote: conroe64
Anyway, this is far more trials than I expected, since 800 (profit objective) / 0.76 (average profit per play) = 1052.63 (total hands to win on average profit objective). Do these results make sense, or am I missing something (or have a bug in my code?)
If only FPDW returned 176%...
I wouldn't need to find a job! :p
800 / 0.0076 (avg profit per play) = 105,263 hands on average.
September 8th, 2012 at 12:32:25 AM
permalink
Your simulation results seems okay (although 1000 runs are a bit low).
For the bankroll question, you can ask "Kelly" for the optimum betsize as fraction of your bankroll.
From the full probability table, the Kelly bankroll is 2924 times your total betsize, that is $3655.
Note that the Kelly bankroll is *not* your "average downswing" it is the bankroll for which you maximize your bankroll growth when playing a single hand of 5 x $0.25.
Below a bankroll of $1750 (roughly halve a Kelly bankroll) your expected growth is in fact *negative* - which means you would definetly want to stop at this point.
For the bankroll question, you can ask "Kelly" for the optimum betsize as fraction of your bankroll.
From the full probability table, the Kelly bankroll is 2924 times your total betsize, that is $3655.
Note that the Kelly bankroll is *not* your "average downswing" it is the bankroll for which you maximize your bankroll growth when playing a single hand of 5 x $0.25.
Below a bankroll of $1750 (roughly halve a Kelly bankroll) your expected growth is in fact *negative* - which means you would definetly want to stop at this point.
September 8th, 2012 at 2:16:10 AM
permalink
Quote: conroe64If I played Deuces Wild Full Pay with optimal strategy, on average, how many plays would it take to earn 800 credits ($1000 playing 5 x $0.25), and how many to earn 8000 credits ($10,000, 5 x $0.25)?
8,000 credits is $2,000. 8,000 bets is $10,000.
September 8th, 2012 at 5:36:19 AM
permalink
Quote: JB8,000 credits is $2,000. 8,000 bets is $10,000.
Okay, so how much money would it take and how many free hot dogs would he get while doing this?
(I know I could have asked how many free beers but I'm posting this in the morning hours (I'm pretty sure) and I am trying to mend my ways.)
September 8th, 2012 at 11:28:34 AM
permalink
176% ... what a dumb mistake.
Anyway, I ran the program all night and it ran for around 25,000 trials. Here are the results
So, to make 1000 dollars, at 500 hands per hour, it'd take around 126808.67 / 500 = 253.6 hours = 31.7 days playing 8 hours a day., and I'd need on average 1014.18 x $1.25 = $1267.73
I calculated one more thing with my program. If you play 100 initial hands, and then played until you broke even, how long, on average would it take (this includes cases where you were ahead after the first 100 plays, in which case you'd quit immediately). Here are the results after 25,000 trials
The worst case in the 25,000 trials was 2085933 plays (4172 hours or 521 days working 8 hours a day) with a needed bankroll of 10029 bets or $12536.25
Anyway, I ran the program all night and it ran for around 25,000 trials. Here are the results
Profit | Average Plays | Average Needed Bankroll |
---|---|---|
800 bets | 126808.67 | 1014.18 bets |
8000 bets | 1074155.91 | 1530.32 bets |
So, to make 1000 dollars, at 500 hands per hour, it'd take around 126808.67 / 500 = 253.6 hours = 31.7 days playing 8 hours a day., and I'd need on average 1014.18 x $1.25 = $1267.73
I calculated one more thing with my program. If you play 100 initial hands, and then played until you broke even, how long, on average would it take (this includes cases where you were ahead after the first 100 plays, in which case you'd quit immediately). Here are the results after 25,000 trials
Profit | Average Plays | Average Needed Bankroll |
---|---|---|
Break even after 100 plays | 6968.81 | 141.89 bets |
The worst case in the 25,000 trials was 2085933 plays (4172 hours or 521 days working 8 hours a day) with a needed bankroll of 10029 bets or $12536.25