Sannsynlighet

Her kan du stille spørsmål vedrørende problemer og oppgaver i matematikk for videregående skole og oppover på høyskolenivå. Alle som føler trangen er velkommen til å svare.

Moderatorer: Aleks855, Gustav, Nebuchadnezzar, Janhaa, DennisChristensen, Emilga

Svar
Gjest

Vi har 9 bokser, i hver av boksene er det en ball. Det vil si til sammen 9 baller fordelt på 9 bokser, én av ballene er svart og de 8 andre er hvite. Du skal peke ut hvilken boks du ikke tror inneholder den svarte ballen. Hver gang du peker ut en boks med en hvit ball får du ett poeng, og boksen fjernes fra spillet. Hver gang du peker ut boksen med den hvite ballen får du minuspoeng, boksene stokkes om og spillet fortsetter helt til kun boksen med svart ball er igjen.

Hva er et rettferdig tall å ha som minuspoeng når en boks med svart ball blir utpekt, altså hva skal verdien av minuspoenget per boks med svart ball utpekt være for at sjansene for å få like mange minuspoeng og plusspoeng til slutt skal være likt?
svar

Gjest skrev: Hver gang du peker ut en boks med en hvit ball får du ett poeng, og boksen fjernes fra spillet. Hver gang du peker ut boksen med den hvite ballen får du minuspoeng
?
Nebuchadnezzar
Fibonacci
Fibonacci
Innlegg: 5648
Registrert: 24/05-2009 14:16
Sted: NTNU

Ett noe ikke trivielt problem. Problet her er jo at vi fortsetter å trekke til vi får en hvit kule (som vi kan anse i sannsynlighetssammenheng som å misslykkes)

Antall fiasko X er geom. fordelt. Slik at forventingsverdien blir $e(X)=(1-p)/p$ der $p=8/9$ i første runde. Forventingsverdien blir dermed

$
E_i(x) = 1 - \frac{x}{i}
$

I den i'te runden. For å finne den totale forventingsverdien må vi legge sammen forventingsverdien i hver runde

$
E(x) = \sum_{i=1}^{8} E_i(x) = 8 - \sum_{i=1}^8 \frac{x}{i} = 8 - \frac{761}{280} x
$

Herfra må vi bare løse $E(x) = 0$ som gir $x \approx 2.9435$. Altså må vi trekke fra omtrent $3$ poeng for at spillet skal være rettferdig. Merk at denne løsningen kunne man og funnet ved å simmulere spillet f.eks via Python

Under har jeg implementert spillet i ballGame, mens for å finne løsningen har jeg implementert bijeksjonsmetoden samt Newtonsmetode. Begge konvergerer ikke spesielt bra, men treffer nogenlunde.

Kode: Velg alt

import random


def ballGame(white=8, black=1, prize=1, penalty=-50):
    score = 0
    boxes = ["white"] * white + ["black"] * black
    while True:
        random.shuffle(boxes)
        ball = random.choice(boxes)
        if ball == "white":
            boxes.remove("white")
            score += prize
        elif ball == "black":
            score += penalty
        if len(boxes) == 1:
            break
    return score


sign = lambda a: (a > 0) - (a < 0)


def avg_score(white, black, prize, penalty, samples):
    scores_sum = 0
    for i in range(samples):
        scores_sum += ballGame(white, black, prize, penalty)
    return scores_sum / samples


def ballGameFair(white=8, black=1, prize=1, samples=100, error=0.001):
    pen_1 = -100
    pen_2 = 100
    n = 0
    while n < samples:
        pen = (pen_1 + pen_2) / 2
        pen_score = avg_score(white, black, prize, penalty=pen, samples=10 ** 3)  #
        if pen_score == 0 or abs(pen_2 - pen_1) / 2 < error:
            return pen

        pen_1_score = avg_score(white, black, prize, penalty=pen_1, samples=10 ** 3)  #
        if sign(pen_1_score) == sign(pen_score):
            pen_1 = pen
        else:
            pen_2 = pen
        n += 1
    return pen


def fprime(white, black, prize, samples, x0, y, h):
    yh = avg_score(white, black, prize, x0 + h, samples)
    return (yh - y) / h


def ballGameNewton(
    white=8, black=1, prize=1, samples=100, iterations=10, x0=0, tolerance=0.001
):
    n = 0
    epsilon = 10 ** (-14)
    while n < iterations:

        print(n, x0)
        y = avg_score(white, black, prize, x0, samples)  #
        yprime = fprime(white, black, prize, samples, x0, y, h=0.00001)

        if abs(yprime) < epsilon:
            break

        x1 = x0 - y / yprime

        if abs(x1 - x0) <= tolerance:
            break

        x0 = x1
        n += 1
    return x1


penalty = -2.9435
white = 8
black = 1

avg_score(white, black, prize=1, penalty=penalty, samples=1000)
print(ballGameFair(samples=10 ** 5, error=10 ** (-8)))
print(ballGameNewton(samples=10 ** 4, x0=0, tolerance=10 * (-2)))
"Å vite hva man ikke vet er og en slags allvitenhet" - Piet Hein
https://s.ntnu.no/Integralkokeboken
Lektor - Matematikk, Fysikk og Informatikk
Gjest

Nebuchadnezzar skrev:Ett noe ikke trivielt problem. Problet her er jo at vi fortsetter å trekke til vi får en hvit kule (som vi kan anse i sannsynlighetssammenheng som å misslykkes)

Antall fiasko X er geom. fordelt. Slik at forventingsverdien blir $e(X)=(1-p)/p$ der $p=8/9$ i første runde. Forventingsverdien blir dermed

$
E_i(x) = 1 - \frac{x}{i}
$

I den i'te runden. For å finne den totale forventingsverdien må vi legge sammen forventingsverdien i hver runde

$
E(x) = \sum_{i=1}^{8} E_i(x) = 8 - \sum_{i=1}^8 \frac{x}{i} = 8 - \frac{761}{280} x
$

Herfra må vi bare løse $E(x) = 0$ som gir $x \approx 2.9435$. Altså må vi trekke fra omtrent $3$ poeng for at spillet skal være rettferdig. Merk at denne løsningen kunne man og funnet ved å simmulere spillet f.eks via Python

Under har jeg implementert spillet i ballGame, mens for å finne løsningen har jeg implementert bijeksjonsmetoden samt Newtonsmetode. Begge konvergerer ikke spesielt bra, men treffer nogenlunde.

Kode: Velg alt

import random


def ballGame(white=8, black=1, prize=1, penalty=-50):
    score = 0
    boxes = ["white"] * white + ["black"] * black
    while True:
        random.shuffle(boxes)
        ball = random.choice(boxes)
        if ball == "white":
            boxes.remove("white")
            score += prize
        elif ball == "black":
            score += penalty
        if len(boxes) == 1:
            break
    return score


sign = lambda a: (a > 0) - (a < 0)


def avg_score(white, black, prize, penalty, samples):
    scores_sum = 0
    for i in range(samples):
        scores_sum += ballGame(white, black, prize, penalty)
    return scores_sum / samples


def ballGameFair(white=8, black=1, prize=1, samples=100, error=0.001):
    pen_1 = -100
    pen_2 = 100
    n = 0
    while n < samples:
        pen = (pen_1 + pen_2) / 2
        pen_score = avg_score(white, black, prize, penalty=pen, samples=10 ** 3)  #
        if pen_score == 0 or abs(pen_2 - pen_1) / 2 < error:
            return pen

        pen_1_score = avg_score(white, black, prize, penalty=pen_1, samples=10 ** 3)  #
        if sign(pen_1_score) == sign(pen_score):
            pen_1 = pen
        else:
            pen_2 = pen
        n += 1
    return pen


def fprime(white, black, prize, samples, x0, y, h):
    yh = avg_score(white, black, prize, x0 + h, samples)
    return (yh - y) / h


def ballGameNewton(
    white=8, black=1, prize=1, samples=100, iterations=10, x0=0, tolerance=0.001
):
    n = 0
    epsilon = 10 ** (-14)
    while n < iterations:

        print(n, x0)
        y = avg_score(white, black, prize, x0, samples)  #
        yprime = fprime(white, black, prize, samples, x0, y, h=0.00001)

        if abs(yprime) < epsilon:
            break

        x1 = x0 - y / yprime

        if abs(x1 - x0) <= tolerance:
            break

        x0 = x1
        n += 1
    return x1


penalty = -2.9435
white = 8
black = 1

avg_score(white, black, prize=1, penalty=penalty, samples=1000)
print(ballGameFair(samples=10 ** 5, error=10 ** (-8)))
print(ballGameNewton(samples=10 ** 4, x0=0, tolerance=10 * (-2)))

WOW! Tusen takk!! :D
Svar