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:
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 |
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:
Schrijf een functie tegenzet waaraan een reeks van drie opeenvolgende kleuren (str) moet doorgegeven worden. Dit stelt de reeks kleuren voor die de eerste speler gekozen heeft. De functie moet de reeks van drie opeenvolgende kleuren (str) teruggeven die de tweede speler kiest als hij de strategie volgt die in de inleiding werd uiteengezet. Als aan de functie geen geldige reeks van drie opeenvolgende kleuren werd doorgegeven, dan moet de functie een AssertionError opwerpen met de boodschap ongeldige reeks.
Schrijf een functie score waaraan drie reeksen opeenvolgende kleuren (str) moeten doorgegeven worden: i) de kleuren die door de eerste speler gekozen worden, ii) de kleuren die door de tweede speler gekozen worden (niet noodzakelijk op basis van de strategie uit de inleiding) en iii) de volgorde van de kleuren waarin de kaarten gedeeld worden. De functie moet een tuple van twee integers (int) teruggeven die respectievelijk de score van de eerste en de tweede speler weergeven op het einde van het spel.
Schrijf een functie winnaar waaraan drie reeksen opeenvolgende kleuren (str) moeten doorgegeven worden: i) de kleuren die door de eerste speler gekozen worden, ii) de kleuren die door de tweede speler gekozen worden (niet noodzakelijk op basis van de strategie uit de inleiding) en iii) de volgorde van de kleuren waarin de kaarten gedeeld worden. De functie moet de waarde 1 (int) teruggeven als de eerste speler het spel wint, de waarde 2 (int) als de tweede speler het spel wint, en de waarde 0 (int) als het spel eindigt op een gelijke stand.
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:
de eerste twee argumenten moeten verschillende, maar even lange reeksen van opeenvolgende kleuren voorstellen; het aantal kaarten in deze reeksen moet dus niet noodzakelijk drie zijn
het derde argument moet de volgorde van de kleuren voorstellen waarin de kaarten van een volledig kaartspel van 52 kaarten (met 26 rode en 26 zwarte kaarten) gedeeld worden
>>> 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
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:
|
Mens: 0
|
|
Computer:
0
|