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

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
lehrkraefte:blc:informatik:glf4-20:simulation:alben-mit-python [2021/05/11 06:22] Ivo Blöchligerlehrkraefte:blc:informatik:glf4-20:simulation:alben-mit-python [2021/05/11 06:23] (current) Ivo Blöchliger
Line 1: Line 1:
 +====== Simulation vieler Sammelalben ======
 +<code python>
 +from random import randrange
 +
 +bilder = 200    # Anzahl Bilder pro Album
 +alben = 10      # Bis wie viele Alben pro Simulation
 +repe = 1000     # Anzahl Simulationen
 +
 +</code>
 +
 +===== Eine Simulation =====
 +  * 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.
 +
 +<code python>
 +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))
 +</code>
 +
 +===== Viele Simulationen =====
 +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.
 +<code text>
 +  [[100,123,88,122], [150,160,124,164], ... ]
 +    1 Album füllen,   2 Alben füllen,    ...
 +</code> 
 +
 +Dazu wird eine Liste mit leeren Liste wie folgt initialisiert:
 +<code python>
 +# Listen für die Resultate für jede Anzahl Alben
 +sims = [[] for i in range(alben)]
 +</code>
 +
 +Die Simulationen werden wie folgt durchgeführt und eingetragen:
 +<code python>
 +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])
 +
 +</code>
 +
 +===== Ausgabe als CSV =====
 +Die Verteilung kann wie folgt als CSV ausgegeben werden:
 +<code python>
 +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()
 +
 +</code>
 +
 +
 +===== Auswertung =====
 +  * 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.