Steve Humble en Yutaka Nishiyama bedachten een gokspel voor twee spelers om daarmee een onverwacht resultaat uit de kansrekening te demonstreren, gebaseerd op een principe dat ontdekt werd door Walter Penney.

Het spel wordt gespeeld met een standaard kaartspel van 52 kaarten dat bestaat uit 26 rode en 26 zwarte kaarten. De kaarten worden één na één gedeeld en in een rij op tafel gelegd. Voor het delen begint, kiest eerst de ene speler een reeks opeenvolgende kleuren die hij hoopt te zien verschijnen tijdens het delen van de kaarten. Daarna kiest de andere speler een andere, maar even lange reeks van opeenvolgende kleuren die hij hoopt te zien verschijnen tijdens het delen van de kaarten. Als bij het delen van de kaarten één van deze twee opeenvolgende reeksen kleuren verschijnt, dan wint de speler die deze reeks gekozen had een punt. Daarna worden alle kaarten die op tafel liggen weggenomen, en gaat het delen verder met de rest van de kaarten uit het kaartspel. Als alle kaarten gedeeld werden, wint de speler die het meeste punten verzameld heeft (in een typisch spelletje worden in totaal ergens tussen de 7 en 9 punten verdeeld tussen de twee spelers).

Stel bijvoorbeeld dat wij twee een spelletje spelen, en dat jij de reeks rood-zwart-rood kiest. Ik kies de reeks rood-rood-zwart, en daarna worden de volgende zes kaarten gedeeld:

Humble-Nishiyama gokspel

Tot nu toe heeft nog niemand een punt gewonnen. De volgende kaart die gedeeld wordt is een rode kaart. Omdat jij de reeks rood-zwart-rood gekozen had, win je een punt. Je neemt de zeven kaarten weg van de tafel en legt ze op jouw stapel. Daarna gaat het delen verder met de resterende 45 kaarten.

Dit lijkt een spel te zijn waarbij beide spelers evenveel kans maken om te winnen, maar in feite bestaat er een strategie die de tweede speler een reuzegrote kans geeft om te winnen. We leggen hier enkel de strategie uit in het geval dat de eerste speler een reeks van drie kleuren heeft gekozen, bijvoorbeeld rood-zwart-rood (of kortweg RZR). Als tegenzet kiest de tweede speler eerst het omgekeerde van de middelste kleur van de eerste speler (in dit geval dus rood), gevolgd door de eerste twee kleuren die door de eerste speler gekozen werden (in dit geval dus rood-zwart). Geloof het of niet, maar dit geeft de tweede speler 82.7% kans om het spel te winnen als er in totaal 7 punten gescoord werden. In een computersimulatie van telkens 1000 spelletjes, bekwamen Humble en Nishiyama de volgende resultaten:

speler #1 speler #2 resultaten
ZZZ RZZ RZZ wint 955 keer, 4 gelijke spelen, ZZZ wint 1 keer
ZZR RZZ RZZ wint 930 keer, 40 gelijke spelen, ZZR wint 30 keer
ZRZ ZZR ZZR wint 805 keer, 79 gelijke spelen, ZRZ wint 116 keer
RZZ RRZ RRZ wint 890 keer, 68 gelijke spelen, RZZ wint 42 keer
ZRR ZZR ZZR wint 872 keer, 65 gelijke spelen, ZRR wint 63 keer
RZR RRZ RRZ wint 792 keer, 85 gelijke spelen, RZR wint 123 keer
RRZ ZRR ZRR wint 922 keer, 51 gelijke spelen, RRZ wint 27 keer
RRR ZRR ZRR wint 988 keer, 6 gelijke spelen, RRR wint 6 keer

Opgave

We stellen de kleur van een kaart voor door een hoofdletter: R voor rood en Z voor zwart. Op die manier kunnen we een reeks opeenvolgende kleuren voorstellen als een string (str) die enkel bestaat uit de letters R en Z. Gevraagd wordt:

De functies score en winnaar moeten een AssertionError opwerpen met de boodschap ongeldige reeksen, als de reeksen die aan de functie doorgegeven worden niet voldoen aan onderstaande voorwaarden:

Voorbeeld

>>> tegenzet('RRR')
'ZRR'
>>> tegenzet('RZZ')
'RRZ'
>>> tegenzet('ZZZ')
'RZZ'
>>> tegenzet('RBRBRBRB')
Traceback (most recent call last):
AssertionError: ongeldige reeks
>>> tegenzet('RGB')
Traceback (most recent call last):
AssertionError: ongeldige reeks

>>> score('ZRR', 'RRR', 'RZRZRRZZZZZRRRRRRRRZRRRZRRRZRZZZZZZRRZZZRRRZRZZZZZZR')
(6, 2)
>>> score('RZR', 'ZRR', 'ZZZZRZRZRZRRZRRZZZRZRZZRRRZZZZRRRZZZRRRRRZZRRZZRRZRR')
(4, 6)
>>> score('ZRR', 'RRZ', 'ZRRRRZRRZRRZZZZRZZRZRZZRRZRRRRRZZZZZRZRZZRRRZRZRZZZR')
(4, 4)
>>> score('ZZR', 'ZRZ', 'ZZRZZRRZZRZZRZRZZZZZRZRRRZRZZZRZRRRZRRRZZRRRRRRZZRRR')
Traceback (most recent call last):
AssertionError: ongeldige reeksen
>>> score('RGB', 'ZRZ', 'RRZZZZRRRRZZRRZRZRRRZZRRZRRZZRZZZRRZZZZRZZRZRRZRRRZZ')
Traceback (most recent call last):
AssertionError: ongeldige reeksen

>>> winnaar('ZRR', 'RRR', 'RZRZRRZZZZZRRRRRRRRZRRRZRRRZRZZZZZZRRZZZRRRZRZZZZZZR')
1
>>> winnaar('RZR', 'ZRR', 'ZZZZRZRZRZRRZRRZZZRZRZZRRRZZZZRRRZZZRRRRRZZRRZZRRZRR')
2
>>> winnaar('ZRR', 'RRZ', 'ZRRRRZRRZRRZZZZRZZRZRZZRRZRRRRRZZZZZRZRZZRRRZRZRZZZR')
0
>>> winnaar('ZZR', 'ZRZ', 'ZZRZZRRZZRZZRZRZZZZZRZRRRZRZZZRZRRRZRRRZZRRRRRRZZRRR')
Traceback (most recent call last):
AssertionError: ongeldige reeksen
>>> winnaar('RGB', 'ZRZ', 'RRZZZZRRRRZZRRZRZRRRZZRRZRRZZRZZZRRZZZZRZZRZRRZRRRZZ')
Traceback (most recent call last):
AssertionError: ongeldige reeksen

Epiloog

Ga de uitdaging aan en probeer de computer te verslaan in het gokspel van Humble-Nishiyama. Na het lezen van deze opgave mag je zelf bepalen of je als eerste of als laatste aan de beurt wil komen om een reeks opeenvolgende kleuren te kiezen.

ZZZ
ZZR
ZRR
ZRZ
RRR
RRZ
RZZ
RZR

#kaarten:
Jouw keuze en de keuze van de computer worden gemarkeerd.
Mens: 0
Computer: 0
 

Bronnen