Bergervei/Python-Das Geburtstagsparadoxon
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>Python</language>
== Problem 1 ==
Wie groß ist die Wahrscheinlichkeit, dass unter $N$ Personen zwei am gleichen Tag Geburtstag haben?
=== Simulation ===
<code id="626111472e5c8">
from random import *
def simulation1(n):
z = 0
ls = [randint(1, 365) for i in range(n)]
for i in range(n - 1):
for j in range(i + 1, n):
if ls[i] == ls[j]:
z = 1; return z
return z
</code>
<run id="6260669394836">
print(simulation1(10))
</run>
=== Mehrfachsimulation ===
<code id="6260669394715">
def experiment1(n, m):
z = 0
for i in range(n):
z += simulation1(m)
return z / n
</code>
<run id="6260669394850">
print(experiment1(10000, 23))
</run>
=== Wahrscheinlichkeit ===
Die Wahrscheinlichkeit, dass unter $N$ Personen zwei am gleichen Tag Geburtstag haben, berechnet sich mit:
<blockquote>
$p(n) = 1 - \dfrac{365 \cdot 364 \cdot \hspace{0.3em} ... \hspace{0.3em} \cdot (365 - (n -1))}{365 ^ n}$
</blockquote>
<code id="626066939475c">
def produkt(von, bis):
p = 1
while von <= bis:
p *= von
von += 1
return p
def wahrscheinlichkeit1(n):
return 1 - produkt(365 - (n - 1), 365) / (365 ** n)
</code>
<run id="6260669394895">
print(wahrscheinlichkeit1(23))
</run>
== Problem 2 ==
Wie viele Personen muss man im Mittel nach ihrem Geburtstag fragen, bis man einen Doppelgeburtstag erhält?
=== Simulation ===
<code id="626085229cf02">
def simulation2():
z = 1
ls = []; dat = randint(1, 365)
while not (dat in ls):
ls.append(dat)
dat = randint(1, 365)
z += 1
ls.append(dat)
return z
</code>
<run id="62606693948d9">
print(simulation2())
</run>
=== Mehrfachsimulation ===
<code id="62606693947e6">
def experiment2(n):
z = 0
for i in range(n):
z += simulation2()
return z / n
</code>
<run id="626066939491e">
print(experiment2(10000))
</run>
Interessanterweise sind unter dieser Fragestellung im Mittel $25$ Personen notwendig.
== Problem 3 ==
Wie groß muss eine Gruppe von Personen sein, damit im Mittel mindestens ein Doppelgeburtstag auftritt?
=== Simulation ===
<code id="6261c1101d8bc">
def simulation3(n):
z = 0
ls = [randint(1, 365) for i in range(n)]
while len(ls) > 0:
z += 1
n = ls[0]; del ls[0]
if n in ls: break
return z
</code>
<run id="6261c1101d96c">
print(simulation3(50))
</run>
=== Mehrfachsimulation ===
<code id="6261c1101d910">
def experiment3(n, m):
z = 0
for i in range(n):
z += simulation3(m)
return 1 - z / n / m
</code>
<run id="6261c1101d9b7">
print(experiment3(10000, 29))
</run>
Bei einer Personengruppe mit $N = 29$ Personen beträgt die Wahrscheinlichkeit mindestens eines Doppelgeburtstages $50 \%$.
== Literatur ==
* [1] F. Barth, R. Haller (2012): Besetzungen und Geburtstage, in: Stochastik in der Schule 32 (3), S. 20–27.
* [2] F. Barth, R. Haller (2013): Gemeinsame Geburtstage, in: Stochastik in der Schule 33 (1), S. 25–32