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)))