I wanted to see if I could figure out the optimal play.
Specifically for 1v1 play with the normal evaluation of hands.
Spoiler Alert: I will not tell you what is the best play : I want to keep my edge.
There are 7776 ways to roll 6 dice but there are only 252 different combinations since order doesn't matter.
Combinations without order with repetions D(5;6)=C(5;5+6-1)= 10! / 5! / 5! = 252
This gives 504 different game decision situations since the number of rerolls left matters and each situation offers you a choice between 2^5=32 options (though most are of course clearly stupid).
Nothing that a modern computer cannot brute force if you take some care to not compute tons of times the same situations (you need an architecture that can store and retrieve partial results)
So I wrote a program in java and collected 120 hands or so that I played against in the arena.
I wrote the program in such a way that it would find and report the best strategy assuming that those 120 hands are representative of what I would face if I kept playing. 120 hands is clearly not enough for that but it was a starting point.
To explain further, I need to create a bit of vocabulary.
So I ran my program against those 120 and got a strategy which I call meta_1, it had a score of only 0.985. A bit worrying but it basically meant that the hands I hand collected were above average.
meta_1 is, of course, a rigid strategy. There are 2 reasons for that really, the first is that computing non rigid strategies is a hell more complex mathematically, I'm not up to that. The second is that the best strategy against a rigid strategy IS a rigid strategy anyway. The point of strategies where some decisions are left to a coin flip is not to get a better score against any given strategy, the point is to minimize the edge that you give to people who know your strategy perfectly and are able to adapt perfectly. Complex stuff.
Then, I used the program to generate the equivalent of 400 billions hands (6^15) using the meta_1 strategy.
(Remember though that there are only 252 combinations, so the trick here is to give a weight to each of the 252 combinations so that the whole lot is a perfectly fair representation of what that strategy ought to produce. I did not roll trillions dice in the program. I did not, in fact, roll a single dice... I'm not simulating, I'm analysing.)
And I fed those 400 billions hands as input to my program (instead of the 120 real hands) and the program gave me back the best strategy to beat strategy meta_1, I obviously called it meta_2 and it scored 1.0010184804565438 against meta_1
This is a very small edge but so be it...
I then iterated the process to create
Of all the 504 decisions, only 1 differs between the meta_5 and meta_6 strategies.
I was getting convinced that I would find an optimal strategy but then meta_7 came along with a 1.00011125554345 score against meta_6 which is higher than what meta_6 had against meta_5 and then meta_8 got a 1.00017301723368 score which reminded me of something...
So I checked and it turns out that meta_7 is exactly the same as meta_3 and meta_8 is exactly the same as meta_4 and I got a loop.
The micro difference in the 2 scores that should be the same is because I slightly changed my program in a manner that slightly impacted rounding. This did help me figure out that I probably have around 14 significative digits in my results. (I did take reasonable care to reduce rounding issues. Nothing fancy though.)
So there is technically no optimal rigid strategy.
But for all practical purposes, meta_5 is optimal, your edge if you play in the best manner possible against someone that you know to be using meta_5 is ridiculously small: you are expected to win 50.0038% of the hands
Next step was to try to figure out how much of an edge someone can have over a new player.
By then, I knew what the important points of strategy are so I devised a noob1 strategy : the worst possible strategy I could think off where none of the decisions look stupid. That strategy was surprisingly close to the one I had been using before this journey...
The best strategy against it (which is not any of the meta above but something in between) has a score of 1.033541200400224 against noob 1
This means that even if your opponent is playing the worst possible "good looking" strategy and you play a strategy specifically crafted to oppose it, you still have less than 51.7% chance to win each hand...
I then devised a noob2 strategy where I removed the bad play that seems the most glaring to me and the best score against it is 1.03088317301264.
Then I did a noob3 which is a strategy that I think many players can reach without thinking too much and the best score against it fell to 1.00947299642452 so already less than 50.5% chance to win each hand
Ok, you want a tidbit of practical information ? The big difference between noob2 and noob3 is how you handle double pair hands. Handle them correctly and nobody will have more than a .5% edge over you (unless you do something else very stupid of course).
Maybe there are some bugs in my program but I did verify a few things by hand and it seems solid.
The point is luck is really paramount.
I started the analysis thinking that you could get to a 55% expected chance to win each hand against an average player but the edge is clearly way less than what I had expected.
It took me about 2 full days to program all this, I had not programmed in a while and it was fun.
The program runs in about 0.4 seconds, reporting included even though the code is ugly as hell.
Specifically for 1v1 play with the normal evaluation of hands.
Spoiler Alert: I will not tell you what is the best play : I want to keep my edge.
There are 7776 ways to roll 6 dice but there are only 252 different combinations since order doesn't matter.
Combinations without order with repetions D(5;6)=C(5;5+6-1)= 10! / 5! / 5! = 252
This gives 504 different game decision situations since the number of rerolls left matters and each situation offers you a choice between 2^5=32 options (though most are of course clearly stupid).
Nothing that a modern computer cannot brute force if you take some care to not compute tons of times the same situations (you need an architecture that can store and retrieve partial results)
So I wrote a program in java and collected 120 hands or so that I played against in the arena.
I wrote the program in such a way that it would find and report the best strategy assuming that those 120 hands are representative of what I would face if I kept playing. 120 hands is clearly not enough for that but it was a starting point.
To explain further, I need to create a bit of vocabulary.
- A rigid strategy is a strategy where you always make the same decision in the same situation : for each of the 504 possible game situations, it tells you which dice to roll and which dice to keep
- Score = When I compare a strategy to a set of hands (presumed representative) I compute a score for it normalize in [0;2] : 2 means always win, 1 means win as often as lose. If you win 60% of the time and draw 2% of the time, the score is 0.60*2 + 0.02 * 1 = 1.22
- Better : A strategy is better than another strategy if it has a score against it above 1
- Optimal Strategy : A strategy is optimal if there is no strategy better than it
So I ran my program against those 120 and got a strategy which I call meta_1, it had a score of only 0.985. A bit worrying but it basically meant that the hands I hand collected were above average.
meta_1 is, of course, a rigid strategy. There are 2 reasons for that really, the first is that computing non rigid strategies is a hell more complex mathematically, I'm not up to that. The second is that the best strategy against a rigid strategy IS a rigid strategy anyway. The point of strategies where some decisions are left to a coin flip is not to get a better score against any given strategy, the point is to minimize the edge that you give to people who know your strategy perfectly and are able to adapt perfectly. Complex stuff.
Then, I used the program to generate the equivalent of 400 billions hands (6^15) using the meta_1 strategy.
(Remember though that there are only 252 combinations, so the trick here is to give a weight to each of the 252 combinations so that the whole lot is a perfectly fair representation of what that strategy ought to produce. I did not roll trillions dice in the program. I did not, in fact, roll a single dice... I'm not simulating, I'm analysing.)
And I fed those 400 billions hands as input to my program (instead of the 120 real hands) and the program gave me back the best strategy to beat strategy meta_1, I obviously called it meta_2 and it scored 1.0010184804565438 against meta_1
This is a very small edge but so be it...
I then iterated the process to create
- meta_3 with a 1.00036682107346 score against meta_2
- meta_4 with a 1.0001730172336805 score against meta_3
- meta_5 with a 1.0001476199564963 score against meta_4
- meta_6 with a 1.00007630683028 against meta_5
Of all the 504 decisions, only 1 differs between the meta_5 and meta_6 strategies.
I was getting convinced that I would find an optimal strategy but then meta_7 came along with a 1.00011125554345 score against meta_6 which is higher than what meta_6 had against meta_5 and then meta_8 got a 1.00017301723368 score which reminded me of something...
So I checked and it turns out that meta_7 is exactly the same as meta_3 and meta_8 is exactly the same as meta_4 and I got a loop.
The micro difference in the 2 scores that should be the same is because I slightly changed my program in a manner that slightly impacted rounding. This did help me figure out that I probably have around 14 significative digits in my results. (I did take reasonable care to reduce rounding issues. Nothing fancy though.)
So there is technically no optimal rigid strategy.
But for all practical purposes, meta_5 is optimal, your edge if you play in the best manner possible against someone that you know to be using meta_5 is ridiculously small: you are expected to win 50.0038% of the hands
Next step was to try to figure out how much of an edge someone can have over a new player.
By then, I knew what the important points of strategy are so I devised a noob1 strategy : the worst possible strategy I could think off where none of the decisions look stupid. That strategy was surprisingly close to the one I had been using before this journey...
The best strategy against it (which is not any of the meta above but something in between) has a score of 1.033541200400224 against noob 1
This means that even if your opponent is playing the worst possible "good looking" strategy and you play a strategy specifically crafted to oppose it, you still have less than 51.7% chance to win each hand...
I then devised a noob2 strategy where I removed the bad play that seems the most glaring to me and the best score against it is 1.03088317301264.
Then I did a noob3 which is a strategy that I think many players can reach without thinking too much and the best score against it fell to 1.00947299642452 so already less than 50.5% chance to win each hand
Ok, you want a tidbit of practical information ? The big difference between noob2 and noob3 is how you handle double pair hands. Handle them correctly and nobody will have more than a .5% edge over you (unless you do something else very stupid of course).
Maybe there are some bugs in my program but I did verify a few things by hand and it seems solid.
The point is luck is really paramount.
I started the analysis thinking that you could get to a 55% expected chance to win each hand against an average player but the edge is clearly way less than what I had expected.
It took me about 2 full days to program all this, I had not programmed in a while and it was fun.
The program runs in about 0.4 seconds, reporting included even though the code is ugly as hell.