Dagens ord


Ansvar väger tyngre än frihet - Responsibility trumps liberty

4 feb. 2022

Risk: Sannolikhet och programmering

En spännande sannolikhetsfråga, lite programmering, och lite om relativ frekvens och de stora talens lag

I spelet Risk ingår ett moment där en spelare får två tärningar och en annan spelare får tre tärningar. Båda spelarna slår sina tärningar och räknar det totala antalet prickar. Om spelaren med två tärningar får minst lika många prickar som spelaren med tre tärningar så vinner spelaren med två tärningar. (Alltså, om båda spelarna får samma antal prickar så vinner spelaren med endast två tärningar). Annars vinner spelaren med tre tärningar.

Hur ofta vinner spelaren med två tärningar? Hur stor fördel är det att ha tre tärningar? Hur stor fördel är det att vinna om antalet prickar blir detsamma för båda spelarna?

Alltså, hur stor sannolikhet är det att spelaren med två tärningar vinner?

Svaret går att räkna ut för hand. Men det är ganska svårt.

Ett annat sätt att svara på frågan är att simulera många spel genom att skriva ett program som slumpar fram tärningskasten, gång på gång på gång... och sedan räknar hur många gånger spelarna vinner. Ju fler spelomgångar som simuleras, desto närmare kommer vi svaret.

Här kommer ett exempel. Du kan själv testa att köra programmet genom att kopiera koden och gå till:

https://colab.research.google.com



import random

vinst_spelare_1 = 0
vinst_spelare_2 = 0

for i in range(100):
    tarning_1 = random.randint(1,6)
    tarning_2 = random.randint(1,6)

    spelare_1 = tarning_1 + tarning_2

    tarning_3 = random.randint(1,6)
    tarning_4 = random.randint(1,6)
    tarning_5 = random.randint(1,6)

    spelare_2 = tarning_3 + tarning_4 + tarning_5

    if spelare_1 >= spelare_2:
        vinst_spelare_1 = vinst_spelare_1 + 1
    else:
        vinst_spelare_2 = vinst_spelare_2 + 1

print('Spelaren med två tärningar vann i', round((vinst_spelare_1/(vinst_spelare_1 + vinst_spelare_2))*100, 2), '% av omgångarna')


Vad händer om du ändar talet 100 (på den fjärde raden) till 1000?

Vad händer om du ändrar talet till 1000000?


Ett betydligt effektivare program som går igenom alla 6^5 = 7 776 möjliga utfall och ger det exakta svaret:



import random

vinst_spelare_1 = 0
vinst_spelare_2 = 0

for tarning_1 in range(1,7):
    for tarning_2 in range(1,7):
        for tarning_3 in range(1,7):
            for tarning_4 in range(1,7):
                for tarning_5 in range(1,7):
                    if (tarning_1 + tarning_2) >= (tarning_3 + tarning_4 + tarning_5):
                        vinst_spelare_1 = vinst_spelare_1 + 1
                    else:
                        vinst_spelare_2 = vinst_spelare_2 + 1

print('Spelaren med två tärningar vinner i exakt', round((vinst_spelare_1/(vinst_spelare_1 + vinst_spelare_2))*100, 2), '% av alla möjliga fall')



I en variant av spelet är är det endast den tärning som visar flest prickar som vinner.  Hur stor är då sannolikheten för att spelaren med två tärningar vinner?



import random

vinst_spelare_1 = 0
vinst_spelare_2 = 0

for tarning_1 in range(1,7):
    for tarning_2 in range(1,7):
        for tarning_3 in range(1,7):
            for tarning_4 in range(1,7):
                for tarning_5 in range(1,7):
                    if max(tarning_1, tarning_2) >= max(tarning_3, tarning_4, tarning_5):
                        vinst_spelare_1 = vinst_spelare_1 + 1
                    else:
                        vinst_spelare_2 = vinst_spelare_2 + 1

print('Spelaren med två tärningar vinner i exakt', round((vinst_spelare_1/(vinst_spelare_1 + vinst_spelare_2))*100, 2), '% av alla möjliga fall')

Inga kommentarer:

Skicka en kommentar