Table of Contents

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

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

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