@PatrickF: Diese „ich weiss dass das nicht so gut ist, weil Anfänger“-Begründung zieht nicht wirklich. Wenn Du weisst das bestimmte Sachen schlecht sind, dann verbessere die. Sonst bleibt das immer so. Denn wenn Du nicht irgendwann mal anfängst zu lernen wie man sauber Programmiert, Namen sinnvoll wählt, und so weiter, wie soll das denn auf magische Weise später mal passieren?
Und auch kopierter Code ist kein Grund den nicht entsprechend zu überarbeiten.
Die Zeile wo ``string.ascii_lowercase`` mit dem Kommentar steht ist sinnfrei, weil das ``string.ascii_lowercase`` keinen Effekt hat. Das Kommentarzeichen sollte da wohl am Anfang der Zeile stehen. Und im Kommentar sollte man sich entweder für Deutsch oder für English entscheiden.
`random_char()` ist als Name inhaltlich falsch, weil das keine zufälligen Buchstaben erzeugt, sondern ein zufälliges Wort. Und der Name beschreibt auch keine Tätigkeit.
`y` sollte `length` heissen und da `x` nicht verwendet wird, würde man da per Konvention den Namen `_` verwenden.
`durchgang` ist kein guter Name für die Gesamtanzahl der Durchgänge. Da würde man als Leser eher die Nummer des aktuellen Durchgangs erwarten.
`ergebnis` als Einzahl für mehere Ergebnisse ist irreführend. Vielleicht auch der Grund warum Du dann später den Fehler gemacht hast diese Liste noch mal in eine Liste zu stecken.
Statt `zaehler` manuell hoch zu zählen, bietet sich `itertools.count()` an.
`suche` ist wieder kein guter Name für `gesuchtes_wort`. Man muss den immer gleichen Wert auch nicht für jeden Durchgang und jeden Rateversuch erneut definieren. Das kann man *einmal* am Anfang machen.
`x` kann man offensichtlich mit `range()`, `list()` und den passenden Argumenten erzeugen. Und `y` ist einfach nur ein umbenanntes `ergebnis`, warum also umbennen und nicht einfach `ergebnis` verwenden.
Es macht keinen Sinn die jeweilige Durchgangsanzahl zu plotten. Das ist einfach nur eine Gerade. Und ein „line plot“ macht bei diesen Daten keinen Sinn, weil zwischen den Werten ja gar keine Zwischenwerte existieren, die durch eine Linie interpoliert werden könnten.
Bei der Beschriftung ist dann "Durchgänge" sehr irreführend, denn die Zahl steht ja für die Nummer des Durchgangs und nicht die Anzahl der Durchgänge.
Zwischenstand:
Code: Alles auswählen
#!/usr/bin/env python3
import random
import string
from itertools import count
import matplotlib.pyplot as plt
#
# `string.ascii_lowercase` oder `string.ascii_uppercase` oder
# `string.ascii_letters` für Groß- und Kleinbuchstaben.
#
ALPHABET = string.ascii_lowercase
def create_random_word(length):
return "".join(random.choice(ALPHABET) for _ in range(length))
DURCHGANGSANZAHL = 5
def main():
gesuchtes_wort = "x"
assert set(gesuchtes_wort).issubset(set(ALPHABET))
versuchsanzahlen = []
for _ in range(DURCHGANGSANZAHL):
for zaehler in count(1):
wort = create_random_word(len(gesuchtes_wort))
print(zaehler, "=", wort, "| ", end="")
if wort == gesuchtes_wort:
versuchsanzahlen.append(zaehler)
print("<-- Gefunden")
break
print(
f"\nAnzahl der Ergebnisse: {len(versuchsanzahlen)} / Menge jeweils: {versuchsanzahlen}/ Durchschnitt: {sum(versuchsanzahlen)/len(versuchsanzahlen)}"
)
plt.scatter(range(1, len(versuchsanzahlen) + 1), versuchsanzahlen)
plt.xlabel("Durchgang")
plt.ylabel("Benötigte Versuche")
plt.title("Ergebnis")
plt.show()
if __name__ == "__main__":
main()