Münzwurf-Generator

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
jnferschmidt@web.de
User
Beiträge: 1
Registriert: Mittwoch 24. Juni 2020, 20:54

Hey Leute,

wir haben im Studium folgende Aufgabe gestellt bekommen, die ich allerdings nicht so gut verstehe, da ich mit Python bis vor 2 Monaten nix zu tun hatte. Ich wäre euch voll dankbar, wenn ihr mir da helfen könntet. Die Aufgabe ist wie folgt:

Stellen Sie sich vor, sie werfen 100mal eine Münze und schreiben K bei Kopf und Z bei Zahl. Wenn Sie sich den Münzwurf wirklich nur vorstellen, dann werden Sie vermutlich NIEMALS sechsmal hintereinander nur K oder nur Z schreiben, obwohl das in der Tat sehr wahrscheinlich ist. Menschen sind deshalb schlecht als „Zufallszahlengenerator“ geeignet.
Schreiben Sie ein Programm, das herausfindet, wie oft einer Sechserreihe „K“ oder „Z“ in einer per Zufallszahlengenerator erzeugten Liste tatsächlich vorkommt. Teilen Sie ein Experiment im Programm in zwei Teile auf

Der erste Teil generiert zufällig 100 K-und Z-Einträge in einer Liste (fällt Ihnen ein effizienter Datentyp dafür ein?)

Der zweite Teil prüft, wie häufig darin eine Sechserreihe vorkommt

Das Experiment mit den 100 Münzwürfen lassen Sie von einer Schleife 10.000mal durchführen und merken sich, wie oft es mindestens eine Sechserreihe gegeben hat. Am Ende können Sie ausrechnen, wie hoch die Wahrscheinlichkeit für eine Sechserreihe bei 100 Münzwürfen ist. Diesen Wert sollen Sie ausgeben. Zumindest bei mir lag er bei etwa 80%!

Zusätzlich habe ich noch eine Frage: Was bedeutet der Code %9%%%?

Vielen Dank schonmal :)
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

Hallo jnferschmidt@web.de
die Aufgabe ist nicht besonders schwer. Mit Listen und Mengen lässt sich das lösen.
Wenn Du nicht weiter kommst, schau hier:https://docs.python.org/3.7/tutorial/index.html
Gruss
Peter
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Hallo,

den ersten Teil kannst du mit Hilfe von random.choice() lösen. Du musst damit nur 100x (mit Hilfe einer for-Schleife und range()) ein Element aus einer Liste ausgeben lassen, die beide Möglichkeiten, also "K" und"Z" enthält. Mit List comprehension lässt sich das in einer Zeile lösen.

Für den zweiten Schritt gibt es mehrere Möglichkeiten. Ich finde es für mich am simpelsten die eben erzeugte Liste mit 100 Einträgen mit Hilfe von string.join() in einen String umzuwandeln und dann mit Hilfe von count() zu zählen, wie oft der Substring "KKKKKK" oder der Substring "ZZZZZZ" in diesem String vorkommen.

Zu dem Code "%9%%%": in welchem Zusammenhang kommt denn dieser Code?
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ jnferschmidt@web.de: Der Code bedeutet in Python gar nichts denn das ist syntaktisch kein gültiges Python:

Code: Alles auswählen

$ python3 -c '%9%%%'
  File "<string>", line 1
    %9%%%
    ^
SyntaxError: invalid syntax
Ich finde ja den Begriff Sechserreihe etwas unterspezifziert. Wieviele Sechserreihen sind hier enthalten:

Code: Alles auswählen

KZZZZZZZZZZZZK
Null mal weil Z nicht 6mal sondern 12mal hintereinander kommt?
Oder zwei mal weil da zwei mal 6mal Z vorkommt?
Oder zählen überlappende Vorkommen auch und es sind 6 Treffer?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
kbr
User
Beiträge: 1508
Registriert: Mittwoch 15. Oktober 2008, 09:27

@__blackjack__: Wahrscheinlich heißt es in der Aufgabenstellung deshalb auch "und merken sich, wie oft es mindestens eine Sechserreihe gegeben hat."

Wenn ich das mit numpy und regex entsprechend der Aufgabenstellung löse, komme ich stets auf etwas um die 54%.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Was stimmt dann bei Dir nicht? Oder bei mir? Ich komme auf ca. 80%:

Code: Alles auswählen

bj@s8n:~$ ./forum18.py 
Anteil von Gruppen mit mindestens einem Lauf: 81.05%.
bj@s8n:~$ ./forum18.py 
Anteil von Gruppen mit mindestens einem Lauf: 80.79%.
bj@s8n:~$ ./forum18.py 
Anteil von Gruppen mit mindestens einem Lauf: 80.70%.
Code dazu:

Code: Alles auswählen

#!/usr/bin/env python3
import random
from enum import Enum
from itertools import islice

from more_itertools import repeatfunc, run_length

Muenze = Enum("Muenze", "KOPF ZAHL")


def laeufe_mit_mindestlaenge_zaehlen(ergebnisse, mindestlaenge):
    return sum(
        1
        for _wert, anzahl in run_length.encode(ergebnisse)
        if anzahl >= mindestlaenge
    )


def main():
    wurfanzahl = 100
    wiederholungen = 10_000
    mindestlaenge = 6

    wurfergebnisse = repeatfunc(random.choice, None, list(Muenze))

    gruppierte_wurfergebnisse = repeatfunc(
        islice, wiederholungen, wurfergebnisse, wurfanzahl
    )
    anzahlen_laeufe = (
        laeufe_mit_mindestlaenge_zaehlen(gruppe, mindestlaenge)
        for gruppe in gruppierte_wurfergebnisse
    )
    anzahl_gruppen_mit_mindestens_einem_lauf = sum(
        1 for anzahl_laeufe in anzahlen_laeufe if anzahl_laeufe > 0
    )
    anteil = anzahl_gruppen_mit_mindestens_einem_lauf / wiederholungen
    print(f"Anteil von Gruppen mit mindestens einem Lauf: {anteil:.2%}.")


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Ich komme auf ca. 75 % ± 2%
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@kbr: Das ändert nichts an meiner Frage denn es macht im Ergebnis einen Unterschied ob exakt 6 Elemente als Treffer zählen oder mindestens 6 Treffer. Was immer Du machst scheint falsch zu sein, denn das ist ja schon recht weit von den 80% entfernt die laut Aufgabenstellung ungefähr herauskommen sollten.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
kbr
User
Beiträge: 1508
Registriert: Mittwoch 15. Oktober 2008, 09:27

Des Rätsels Lösung: ich habe mich *exakt* an die Aufgabenstellung gehalten:

"Das Experiment mit den 100 Münzwürfen lassen Sie von einer Schleife 10.000mal durchführen und merken sich, wie oft es mindestens eine Sechserreihe gegeben hat."

Dann komme ich auf ca. 54%.

Wenn ich hingegen aufaddiere, wie viele nicht überlappende Sechserreihen insgesamt vorkommen, dann erreiche auch ich ca. 75%.

Bei überlappenden Sechserreihen wären es noch mehr. Das habe ich gleichfalls ausprobiert und komme dann auf deutlich über 100%, was nicht unbedingt überraschend ist.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@kbr: Wo halte ich mich denn nicht an die Aufgabenstellung? Und ich erreiche die 80% die — laut Aufgabenstellung!!! — auch das richtige Ergebnis sein sollten.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
kbr
User
Beiträge: 1508
Registriert: Mittwoch 15. Oktober 2008, 09:27

@__blackjack__: Die Feinheit liegt in der Formulierung "und merken sich, wie oft es *mindestens* eine Sechserreihe gegeben hat." Wenn hingegen *alle* Sechserreihen gezählt werden, gibt es ein anderes Ergebnis. Und warum Du dabei auf 80% kommst und ich etwas weniger habe, weiß ich auch nicht. Vielleicht ist Dein random-Modul auf speed ;-)
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@kbr: Was meinst Du mit anderes Ergebnis? Was würdest Du denn in dem Fall das jemand alle Sechserreihen zählt denn am Ende ausrechnen? Wenn dabei dann tatsächlich eine Wahrscheinlichkeit mit mehr als 100% heraus kommt, dann muss ja die Rechnung an sich schon falsch sein, denn die Wahrscheinlichkeit das ein Ereignis mit mehr als 100% Wahrscheinlichkeit eintritt ist unmöglich.

Und noch einmal: 80% ist das richtige Ergebnis. Das sagt der AUFGABENTEXT. Das sagt nicht jnferschmidt@web.de sondern die Person die die Aufgabe gestellt hat, hat das bereits als Ergebnis mitgeliefert. 54% sehe ich dem Kontext auch nicht als „etwas weniger“ sondern als ziemlich weit vom korrekten Ergebnis weg an.

Ha, und ich weiss auch welchen Fehler Du gemacht hast. Wenn ich nämlich den gleichen Fehler mache, bekomme ich auch Dein falsches Ergebnis:

Code: Alles auswählen

bj@s8n:~$ ./forum18.py 
Anteil von Gruppen mit mindestens einem Lauf: 54.50%.
bj@s8n:~$ ./forum18.py 
Anteil von Gruppen mit mindestens einem Lauf: 55.36%.
bj@s8n:~$ ./forum18.py 
Anteil von Gruppen mit mindestens einem Lauf: 55.35%.
Du musst die Aufgabenstellung wirklich noch mal exakt lesen *was* da gezählt werden soll.

Edit: Wobei man das vielleicht auch falsch verstehen kann, aber mit den 80% als Zielvorgabe ist dann doch wieder klar wie das gemeint sein muss.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
nezzcarth
User
Beiträge: 1764
Registriert: Samstag 16. April 2011, 12:47

__blackjack__ hat geschrieben: Donnerstag 25. Juni 2020, 17:11 Edit: Wobei man das vielleicht auch falsch verstehen kann, aber mit den 80% als Zielvorgabe ist dann doch wieder klar wie das gemeint sein muss.
Da ich es anfänglich auch falsch gemacht habe, stimme ich ebenfalls dafür, dass man es falsch verstehen kann ;)

Meine neue Lösung liefert indes das richtige Ergebnis -- wenn auch leider nicht sehr schnell:

Code: Alles auswählen

$ for _ in {1..10000}; do od -w2  -An -tu2 -N 200 < /dev/urandom  | awk '{print $0 % 2}' |uniq -c | awk -v "result=0" '$1 > 5{result = 1;exit}END{print result}'; done | sort | uniq -c | sort -n
   1929 0
   8071 1
Benutzeravatar
kbr
User
Beiträge: 1508
Registriert: Mittwoch 15. Oktober 2008, 09:27

@__blackjack__: Da es Dir gelungen ist, die 54% zu reproduzieren, hast Du sicher auch meine Differenzierung zwischen 'mindestens' und 'alle' nachvollzogen. Dann hätte Dir auch auffallen können, dass mein 'etwas weniger' sich auf die 75% bezog und das, wenn es einen Fehler gab, dieser in der Aufgabenstellung lag. Mehr als 100% ist übrigens sehr gut möglich, ist dies doch nur der Quotient aus Dividend und Divisor. Ob dies physikalisch Sinn ergibt, ist eine andere Frage. Aber wenn auch Überlappungen von Sechserreihen betrachtet werden, wirst auch Du dieses Ergebnis erhalten.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@kbr: Nein diese Differenzierung verstehe ich nicht, denn 54% und 80% hat nichts mit ”mindestens” und ”alle” zu tun sondern wie man das ”oder” interpretiert.

Eine Wahrscheinlichkeit liegt immer zwischen 0 und 1, beides inklusive, beziehungsweise 0% und 100% wenn man es als Prozent ausdrückt. Jedes Ergebnis ausserhalb dieses Bereichs kann keine Wahrscheinlichkeit sein. Auch ”physikalisch” nicht, aber *das* Wort macht auch absolut keinen Sinn, denn das hat überhaupt nichts mit Physik zu tun. Und die Aufgabenstellung fragt nach der Wahrscheinlichkeit. Mehr als 100% ist also nicht möglich ausser natürlich das Ergebnis ist falsch, aber *dann* ist natürlich alles ”möglich”.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

Ich finde die Aufgabenstellung da nicht ganz eindeutig. Zuerst heißt es:
jnferschmidt@web.de hat geschrieben: Mittwoch 24. Juni 2020, 21:06 Schreiben Sie ein Programm, das herausfindet, wie oft einer Sechserreihe „K“ oder „Z“ in einer per Zufallszahlengenerator erzeugten Liste tatsächlich vorkommt.
[...]
Der zweite Teil prüft, wie häufig darin eine Sechserreihe vorkommt
Hier können pro 100 Würfe mehrere Sechserreihen gefunden werden.

Später heißt es aber dann:
jnferschmidt@web.de hat geschrieben: Mittwoch 24. Juni 2020, 21:06 Das Experiment mit den 100 Münzwürfen lassen Sie von einer Schleife 10.000mal durchführen und merken sich, wie oft es mindestens eine Sechserreihe gegeben hat.
Hier klingt es, als wäre es nur wichtig, ob pro 100 Würfe eine Sechserreihe vorkommt und mehrfachvorkommen ignoriert werden. Dadurch hat man dann pro 100 Würfe nur max einen Treffer und die Wahrscheinlichkeit geht auf ca 54% zurück.
nezzcarth
User
Beiträge: 1764
Registriert: Samstag 16. April 2011, 12:47

Zizibee hat geschrieben: Freitag 26. Juni 2020, 06:27 Hier klingt es, als wäre es nur wichtig, ob pro 100 Würfe eine Sechserreihe vorkommt und mehrfachvorkommen ignoriert werden. Dadurch hat man dann pro 100 Würfe nur max einen Treffer und die Wahrscheinlichkeit geht auf ca 54% zurück.
Ich komme auf 80%, wenn ich Gruppen mit einer Anzahl von sechs oder mehr zähle und auf 54%, wenn ich Gruppen mit sechs oder mehr Wiederholungen zählen. Die Behandlung von Mehrfachvorkommen ist in beiden Fällen gleich.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@zizibee: Okay ich bin dann wohl offiziell zu doof für diese Aufgabe, denn bei „wie oft es mindestens eine Sechserreihe gegeben hat.“ sehe ich nicht wie man da Mehrfachvorkommen ignorieren kann, denn da steht „mindestens“, also 1 mal oder eben auch *mehr als einmal*.

@nezzcarth: Auch hier komme ich nicht mit. Was genau ist der Unterschied zwischen „wenn ich Gruppen mit einer Anzahl von sechs oder mehr zähle“ und „wenn ich Gruppen mit sechs oder mehr Wiederholungen zählen“? Das klingt a) beides gleich für mich und b) scheint das nichts damit zu tun zu haben wie *ich* die 54% hinbekommen habe, es sei denn Du hast die wichtige Information in beiden zitierten Satzteilen vergessen *was* da gezählt wird. Dann würde das auch nicht mehr so gleich klingen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
kbr
User
Beiträge: 1508
Registriert: Mittwoch 15. Oktober 2008, 09:27

@__blackjack__: Mit Differenzierung meine ich, dass es darauf ankommt, was betrachtet wird. Wenn Du in vielen 100er Sequenzen *alle* Sechserreihen zählst und anschließend berechnest, wie häufig Sechserreihen anzutreffen sind, dann erhältst Du die ca. 80%. Nun sammelst Du alle diese 100er Sequenzen in einer Box und ziehst eine. Wie hoch ist die Wahrscheinlichkeit, das sich in dieser Sequenz *mindesten* eine Sechserreihe befindet? Es sind keine 80%, sondern nur 54%. In 46% der Sequenzen wird sich keine Sechserreihe befinden, da diese eben nicht gleichverteilt vorkommen.
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

@nezzcarth: Ich bin jeweils die 100 Würfe durch gegangen und sobald ich 6 gleiche Symbole hintereinander gefunden habe, habe ich einen Zähler um 1 erhöht und bin direkt zum nächsten 100er Wurf weiter. So bin ich auch immer bei ca 54 % gelandet...

@__blackjack__: Da bei dir das richtige raus kommt und bei mir nicht, bist es wohl nicht du, der zu doof dafür ist ;)
Hier mal als Beispiel, wie ich die Aufgabe (wohl fälschlicherweise) interpretiert hatte.
Wurf 1) ZKKKKZKKKK
Wurf 2) ZZZZZKKKZZ
Wurf 3) ZKZKZKZKZK
Wenn jetzt die Frage kommt wie "oft es mindestens eine Viererreihe gegeben hat.", lautete meine Antwort in Wurf 1 und in Wurf 2 hat es mindestens eine Viererreihe gegeben, also insgesamt bei zwei Würfen, also zwei mal.
Antworten