Zessen: MATLAB reveals the ultimate secret

Posted on 01 Feb 2016

Introduction
This is the first blog I write for T.F.V. ‘Professor Francken’. Before writing this blog, I decided I wished to avoid cliché comparisons between physical principles and the life of a Franckenmember (with a vaguely connection to drinking) and do some actual research instead. This research, in my opinion, should be very useful for Franckenmembers (in particular). After some moments of reflection, deep thoughts about the fundamental forces that act on Franckenmembers, and a large dt in my frame of reference (combined with a small dx), I found a nice hypothesis I wanted to test. It had to do with a quite popular game, zessen, and theories about regularities in it.

Zessen
I believe many of the readers of this blog will be familiar with the game zessen. It is also featured in the award winning almanak, which I would advise all of you to read. For those who are a bit fuzzy on zessen, here’s how it works. The game starts with 6 shot glasses and a die. The players take turns throwing the die. Let the outcome of a throw be n. If shot glass n is full, the player drinks the shot. If the shot glass is empty, the player fills it. If this is the last shot glass to be filled, the player drinks everything. Despite the (apparent) simplicity of this game, various wild and complex theories about the progress of this game have been brought to life, not the least by myself. It has been thought that, dependent on the number of players, there would be a pattern in who gets to drink. In particular, with six or seven players, it seems that one side of the table takes all the shots, and the other side fills the glasses. It has also been theorized that this epicenter of the game rotates; sometimes in the same direction as the die, sometimes in the opposite direction (also dependent on the amount of players). Another regularity people seem to find is that the person to drink the six shots at once seems to be the same person over and over again. Inspired by all these beautiful conjectures, I set off to find the truth behind it all. How? Play it? Well, that too. But MATLAB is just a bit better at finding out quickly what happens after 10 000 turns (and also at remembering it).

How to simulate it?
Making the script was not very compicated, because the game is not very complicated. The script can be found at the end of this blog. It requires, as input, the number of players and the number of turns, and it returns all the information I desired: A combined plot of how much the players have drunk as a function of time, a plot of how much is drunk in total, a vector that shows for every player how many times he/she has drunk all the shots at once (zadt), a vector that shows per player the estimation value of shots drunk by the player when it’s the player’s turn and the overall estimation value of shots being drunk per turn. And now we run it!

[caption id="attachment_5515" align="aligncenter" width="300"]Figure 1: 6 players, 700 turns, plot of every player Figure 1: 6 players, 700 turns, plot of every player[/caption]
Figure 1: 6 players, 700 turns, plot of every player

[caption id="attachment_5498" align="aligncenter" width="300"]Figure 2: 6 players, 400 turns, total consumption Figure 2: 6 players, 400 turns, total consumption[/caption]
Figure 2: 6 players, 400 turns, total consumption

[caption id="attachment_5503" align="aligncenter" width="300"]Figure 3: seven players, 1000 turns, plot of every player Figure 3: seven players, 1000 turns, plot of every player[/caption]
Figure 3: seven players, 1000 turns, plot of every player

Results
I think the result is best described by the figures 1 to 6. The theories about the epicenter and the epicenter rotating can now be classified as a myth busted: Zessen appears quite random. However, there is one peculiarity: When the number of players is even, the players who start second, fourth, sixth etc. drink more! This can be explained by how the number of shots can change after a turn: It goes +1, -1, or -5. This means: if you have an odd number of shots, the next player will have an even number of shots and vice versa. When the number of players is even, this means you’ll either have only even or only odd numbers throughout the game (due to the cyclicity of the turn). Furthermore, you can only drink all six (an even number) shots at a time if you start with five (an odd number) shots. This, combined with the fact that you start with zero (an even number) shots, means only the players who have an even starting number can be the ones to drink all six shots at a time. We can see this clearly in the estimation value vector. The players 2, 4 and 6 drink around 0,616 shots every time they throw, while the players 1, 3 and 5 only get to a scanty 0,456! What an unfair game! With seven players, the estimation value converges to the same value for every player: 0,537. This is also the overall estimation value of shots being drunk per turn, for any number of players. The tangent of the lines in figure 2 and 4 also approach this ratio. The event of a player dinking all the shots happens only 1,2% of the turns. Yes, patience is a clean matter.

[caption id="attachment_5502" align="aligncenter" width="300"]Figure 4: seven players, 1000 turns, total consumption Figure 4: seven players, 1000 turns, total consumption[/caption]
Figure 4: seven players, 1000 turns, total consumption

[caption id="attachment_5501" align="aligncenter" width="300"]Figure 5: six players, 500000 turns, plot of every player Figure 5: six players, 500000 turns, plot of every player[/caption]
Figure 5: six players, 500000 turns, plot of every player

[caption id="attachment_5504" align="aligncenter" width="300"]Figure 6: seven players, 500000 turns, plot of every player Figure 6: seven players, 500000 turns, plot of every player[/caption]
Figure 6: seven players, 500000 turns, plot of every player

Conclusion
Now that I have found this result, I can see a memory come back of some smart guys who had come to the same conclusion (both analytically and by repeated measurement): don’t play with an even number of players. I guess the game zessen is also the reason why this memory was not really available in the first place.

A(n)d now?
The journey doesn’t stop here. We are/were/could be applied physicists: it’s a solution we seek! I have enlisted some ways to avoid the unfairness:

  1. If you are with an even number of people, sacrifice yourself and throw two times in a row every (couple of) rounds. This way there is practically an odd number of players.
  2. Play with an odd number of shot glasses (and of course a die with an equal amount of faces).
  3. Change the rules a bit: after a player has drunk all six of the shots, he/she also fills an odd amount of shots.
  4. Regularly drink an odd number of shots without a reason related to the game.
  5. Use bottles instead of glasses.

I hope this blog has really given you new insights and can contribute to a new way of zessen and a new way of life. Together we can simulate all the drinking games and find more crucial information that we could have known already. Want to test the simulation for yourself? Implement the attached script in MATLAB. Tired of physically throwing a die? Give a group of people numbers, run a simulation and then drink the given amount. Not as much fun as playing with a physical die? I’m sorry. Still want to play with a die? See you in the Franckenroom. Zes!

Script n=ceil(input('How many people are playing? '));
turnmax=ceil(input('How many turns do you want to play? '));
result=zeros(turnmax+2,n);
result(1,:)=[1:n];
result(2,:)=zeros(1,n);
%The top row of the result matrix will contain the player numbers
%The j-th row will tell you how many shots a player has drunk after j-2
%turns
shots=zeros(1,6);
dice=randi([1 6],1,turnmax);
turns=[0:turnmax];
drunk=zeros(1,length(turns));
zadt=zeros(1,n);
for turn=1:turnmax
player=mod(turn-1,n)+1;
die=dice(turn);
if ~shots(die)
shots(die)=1;
if shots==ones(1,6)
shots=zeros(1,6);
result(turn+2,:)=result(turn+1,:);
result(turn+2,player)=result(turn+1,player)+6;
drunk(1,turn+1)=drunk(turn)+6;
zadt(1,player)=zadt(1,player)+1;
%The last glass is filled, the player drinks everything
else
result(turn+2,:)=result(turn+1,:);
drunk(1,turn+1)=drunk(turn);
%An empty glass is filled, no one drinks
end
else
shots(die)=0;
result(turn+2,:)=result(turn+1,:);
result(turn+2,player)=result(turn+1,player)+1;
drunk(1,turn+1)=drunk(turn)+1;
%A full glass is emptied, the player drinks
end
end
plot(turns,result(2:end,1));
hold on
for i=2:n
plot(turns,result(2:end,i));
end
hold off
figure
plot(turns,drunk);
zadt
n*result(turnmax,:)/turnmax
drunk(turnmax)/turnmax


Written by

  • Steven Groen