====== 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 ===== 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. 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 vollvoll: # 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)) ===== 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. [[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]) ===== Ausgabe als CSV ===== 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() ===== 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.