lehrkraefte:blc:informatik:glf4-20:simulation:alben-mit-python

Simulation vieler Sammelalben

from random import randrange
 
bilder = 200    # Anzahl Bilder pro Album
alben = 10      # Bis wie viele Alben pro Simulation
repe = 1000     # Anzahl Simulationen
  • Die Idee ist, eine Liste num zu haben, deren Einträge angeben, wie oft man ein Bild schon besitzt.
  • Das kleinste Element der Liste num gibt an, wie viele Alben man füllen kann.
  • Man kauft ein Bild nach dem anderen und passt den entsprechenden Eintrag in num an.
  • Immer wenn ein weiteres Album gefüllt werden kann, speichert man die Anzahl gekaufter Bilder an der entsprechenden Stelle in der Liste result.
  • Das Resultat der Simulation ist eine Liste mit (aufsteigenden) Zahlen, die angeben, wie viele Bilder insgesamt für jede Anzahl Alben nötig waren.
def simulation(bilder, alben):
    # Liste mit der Anzahl jedes Bildes
    num = [0 for i in range(bilder)]
    voll = 0   # Anzahl voller Alben
 
    result = [0 for i in range(alben)]   # Achtung: Resultat für 1 Album füllen bei Index 0!
 
    gekauft = 0  # Anzahl gekaufter Bilder
    while voll<alben:
        gekauft+=1
        # Ein zufälliges Bild "kaufen" und in die Liste num entsprechend anpassen:
        # TODO
        m = min(num)   # Kleinstes Element der Liste
 
        # Ein Album mehr gefüllt?
        if m>voll:
            # Anzahl gekaufter Bilder an korrekter Stelle in der Liste result speichern.
            # TODO
            # Anzahl voller Alben aktualisieren
            voll=m
    return result
 
# Zum Testen:
print(simulation(200,10))

Interessant ist die Verteilung der Resultate (nebst dem Durchschnitt, der ungefähr der Anzahl zu kaufender Bilder entspricht, mit 50%-iger Wahrscheinlichkeit entsprechend viele Alben zu füllen).

Um die Verteilung aufzeichnen zu können, müssen die Resultate sortiert werden. Dazu erstellen wir erst eine Liste deren Einträge Listen mit den Resultaten für eine bestimme Anzahl Alben sind.

  [[100,123,88,122], [150,160,124,164], ... ]
    1 Album füllen,   2 Alben füllen,    ...

Dazu wird eine Liste mit leeren Liste wie folgt initialisiert:

# Listen für die Resultate für jede Anzahl Alben
sims = [[] for i in range(alben)]

Die Simulationen werden wie folgt durchgeführt und eingetragen:

for i in range(repe):
    # Simulation ausführen, Resultat in r  (z.B. ist r[2] die benötigte Anzahl Bilder für 3 Alben)
    r = simulation(bilder,alben)
    for j in range(alben):
        # Das Resultat r[j] (für j+1 Alben) der korrekten Liste in sims hinten anhängen (mittels .append)
        # TODO
 
# Listen sortieren, um eine Verteilung zu erhalten:
for j in range(alben):
    sims[j] = sorted(sims[j])

Die Verteilung kann wie folgt als CSV ausgegeben werden:

csv = "p"
for i in range(alben):
    csv+= ";%d" % (i+1)
csv+="\n"
for i in range(repe):
    csv += "%.3f" % ((i+1)/repe)
    for j in range(alben):
        csv += ";%d" % sims[j][i]
    csv+= "\n"
print(csv)
f = open("verteilung.csv", "w")
f.write(csv)
f.close()
  • Zeichnen Sie die Daten als Diagramm und interpretieren Sie dieses.
  • Berechnen Sie aus diesen Daten (in Excel oder Python) folgendes:
    • Anzahl zu kaufender Bilder, um eine Wahrscheinlichkeit von 50%, 90% und 99% für das Füllen von 1,2, etc. Alben zu erhalten.
    • Für jede Anzahl Alben, die Anzahl zu kaufender Bilder pro Album, um obige Füllwahrscheinlichkeiten für die gegebene Anzahl Alben zu erhalten.
  • lehrkraefte/blc/informatik/glf4-20/simulation/alben-mit-python.txt
  • Last modified: 2021/05/11 08:23
  • by Ivo Blöchliger