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?
Sannsynlighet
Moderatorer: Aleks855, Gustav, Nebuchadnezzar, Janhaa, DennisChristensen, Emilga
?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
-
- 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.
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
https://s.ntnu.no/Integralkokeboken
Lektor - Matematikk, Fysikk og Informatikk
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!!