stochastik

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.
Antworten
oBoN
User
Beiträge: 2
Registriert: Sonntag 13. November 2011, 19:45

Hallo!
Ich bin ein absoluter Neuling im Thema programmieren. Durch mein Mathe-Studium bin ich gerade im Bereich Stochastik und arbeite mit R. Zufällig bin ich vor ein paar Wochen auf das Thema Programmieren gekommen und hab mich gleich verliebt :D
Hin und wieder nehm ich mir die zeit und versuche meine Aufgaben nicht mit R sondern mit Python zu erstellen, weil es einfach mehr Freude macht :)
Zu meinem Problem:
Ein Reißnagel wird geworfen 1 steht für "landet auf kopf" und 0 steht für "landet schrägliegend".
Es soll 100 mal geworfen werden und die rel. und abs. Häufigkeit angegeben werden.
Jetzt ist der Fall dass jemand bescheißen will und nur 10 mal wirft und das Ergebnis 10 mal hintereinander schreibt.

Mein Anfang:

Code: Alles auswählen

for i in range(10):
     for i in range(10):
         print(0,1,1,1,0,1,1,1,0,1)
Es klappt aus wunderbar. Wie aber kann ich mir die absolute Häufigkeit angeben lassen?
Dazu bräuchte ich nur die Summe der Ereignisse, da die Summe ja die Anzahl der vorkommenden 1sen angeben würde.
Aber wie baue ich da jetzt eine sum() Funktion o.ä. ein?? :K

wär super wenn mir wer helfen könnte! Danke schonmal :)
BlackJack

@oBoN: Dazu müsstest Du das nicht (nur) ausgeben, sondern (auch) in einer Datenstruktur vermerken, damit Du damit hinterher noch Rechnungen anstellen kannst. Arbeite am besten mal das Tutorial in der Python-Dokumentation durch.
problembär

@oBoN: Also, zweimal "for i ..." ineinander ist nicht gut. Nimm beim zweiten mal "for u ..." oder so.

Ein Vorschlag wäre

Code: Alles auswählen

#!/usr/bin/env python
# coding: iso-8859-1

a = (0, 1, 1, 1, 0, 1, 1, 1, 0, 1)
d = {0 : 0,
     1 : 0}
for i in range(10):
    for u in a:
        if u:
            d[1] += 1
        else:
            d[0] += 1
        print u, 
    print
print "0 : " + str(d[0])
print "1 : " + str(d[1])
"d" ist da ein Dictionary. Kannst ja mal ein bißchen darüber lesen.

Für Python 3.x müßtest Du noch Klammern um die print-Statements/Funktionen machen (ohne die Klammern ist Python 2.x-Syntax).
oBoN
User
Beiträge: 2
Registriert: Sonntag 13. November 2011, 19:45

:mrgreen: hihi :) wie kuhl! aber sagt mal... ist das was ich jetzt noch angehängt hab elegant geschrieben oder Troll unfug?

Code: Alles auswählen

# coding: iso-8859-1
a = (0, 1, 1, 1, 0, 1, 1, 1, 0, 1)
d = {0 : 0,
     1 : 0}
for i in range(10):
    for u in a:
        if u:
            d[1] += 1
        else:
            d[0] += 1
        print (u),
    print

print('absolute Häufigkeiten')
print ("0 : " + str(d[0]))
print ("1 : " + str(d[1]))

print('relative Häufigkeiten')
print ("0 : " + (str(d[0]/100)))
print ("1 : " + (str(d[1]/100)))
kann ich den Teiler 100 auch irgendwie als len(a)*len(a) ausdrücken, oder wär das dann grober unfug :D
BlackJack

@oBoN: Von einem Mathestudenten hätte ich jetzt nicht erwartet, dass er überhaupt diese Schleife schreibt und das tatsächlich für alle 100 Würfe auszählt. Des weiteren braucht man ja nicht 1en und 0en zählen, sondern nur eines davon. Dafür braucht man dann auch kein Wörterbuch. Das lässt sich alles mit ein paar einfachen Rechnungen ermitteln.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

BlackJack hat geschrieben:@oBoN: Von einem Mathestudenten hätte ich jetzt nicht erwartet, dass er überhaupt diese Schleife schreibt und das tatsächlich für alle 100 Würfe auszählt. Des weiteren braucht man ja nicht 1en und 0en zählen, sondern nur eines davon. Dafür braucht man dann auch kein Wörterbuch. Das lässt sich alles mit ein paar einfachen Rechnungen ermitteln.
Um einmal vorzumachen wie sich das entwickelt:

Code: Alles auswählen

data = (0, 1, 1, 1, 0, 1, 1, 1, 0, 1)
counter = 0
for i in range(10):
    for value in data:
        counter += value
print counter

Code: Alles auswählen

data = (0, 1, 1, 1, 0, 1, 1, 1, 0, 1)
counter = 0
for i in range(10):
    counter += sum(data)
print counter

Code: Alles auswählen

data = (0, 1, 1, 1, 0, 1, 1, 1, 0, 1)
print 10 * sum(data)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

@oBoN
Noch ein Wort zu R: R ist eine sehr mächtige Sprache, wenn es um Statistik und mehr geht. Doch sein besonderes Objekt-System läßt R vom look&feel sooo anders zu vielen anderen Sprachen sein, daß R IMHO kein guter Einstieg ins Programmieren ist, denn es macht R nicht nur syntaktisch, sondern auch teil semantisch einfach verschieden.

Im Übrigen ist BJs Vorschlag doch erst einmal das Tutorial zu lesen a) nicht so arbeitsaufwendig und b) sehr viel wert ;-).

Gruß,
Christian
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

problembär hat geschrieben:@
Ein Vorschlag wäre

Code: Alles auswählen

#!/usr/bin/env python
# coding: iso-8859-1

a = (0, 1, 1, 1, 0, 1, 1, 1, 0, 1)
d = {0 : 0,
     1 : 0}
for i in range(10):
    for u in a:
        if u:
            d[1] += 1
        else:
            d[0] += 1
        print u, 
    print
print "0 : " + str(d[0])
print "1 : " + str(d[1])
Oha... auch wenn ja schon gezeigt / gesagt wurde, dass man kein Dictionary braucht ist diese Lösung extrem umständlich! Wozu diese `if`-Abfrage? Die kann man sich doch schenken, da in a nur Werte enthalten sind, die man als Schlüssel in d angelegt hat.

Also geht es doch so viel einfacher:

Code: Alles auswählen

for i in range(10):
    for u in a:
        d[u] += 1
Jetzt kann man sich noch überlegen, ein `defaultdict` zu nehmen und mit `int` zu initialisieren; damit spart man sich das Anlegen der Schlüssel.

In Python 3 könnte man da jetzt auch mit einer Dict-Comprehension sicher noch die Schleifen einsparen ;-)

Das alles nur als Anmerkung zum Code von problembär - sinnvoller sind hier speziell eh andere Ansätze.

Edit: Hey, erster Post als Ex-Student - und dann so ein pedantischer... oh weia, muss diese Uni-Attitüde schnell los werden :mrgreen:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
problembär

Hyperion hat geschrieben:Also geht es doch so viel einfacher:

Code: Alles auswählen

for i in range(10):
    for u in a:
        d[u] += 1
Ja, stimmt. Guter Gedanke.
Es heißt ja "Softwareentwicklung": Ich denke, man kann nicht erwarten, daß Code, den man hier postet, gleich perfekt ist. Wäre gut, wenn er erstmal überhaupt in sich lauffähig ist. Kann in der ersten Version sogar noch ein paar Bugs haben. Nachdem Fehler behoben sind, kann man unter Umständen nochmal darüber nachdenken, solche Sachen, die vielleicht etwas umständlich oder nicht gut ausgedrückt sind, nochmal besser zu machen.
Wenn ihr sofort Perfektion erwartet, regt ihr euch natürlich dauernd über die ersten, nicht perfekten Vorschläge auf. Nicht mein Problem.
Hyperion hat geschrieben:Edit: Hey, erster Post als Ex-Student - und dann so ein pedantischer... oh weia, muss diese Uni-Attitüde schnell los werden
Geht schon. Nicht pedantischer als die der anderen. Es ist aber jedenfalls ein guter Vorsatz, mit anderen Forenteilnehmern freundlicher umzugehen, vor allem mit denen, die (wie ich) nicht Programmierung an der Uni studiert haben.

@oBoN:

Code: Alles auswählen

print ("0 : " + (str(d[0]/100)))
print ("1 : " + (str(d[1]/100)))
Hier solltest Du beachten, daß Du durch einen Integer (100) teilst: Dabei können Nachkommastellen mathematisch falsch abgeschnitten werden:

Code: Alles auswählen

>>> 5 / 2
2
Um das zu vermeiden, teile durch Float, indem Du noch einen Punkt anfügst:

Code: Alles auswählen

>>> 5 / 2.
2.5
Bei Dir also "/ 100.".

Und ihr anderen, universitär Ausgebildeten: Sagt Leuten, die hier Fragen stellen, doch lieber solche wichtigen Sachen, die sie in Python voranbringen (wie das mit dem Teilen durch Integer), anstatt immer nur "Das, was Du da machen willst, geht mit Modul XY, und außerdem ist es sowieso nicht sinnvoll, weil bla, bla, bla."
Das ist sonst nur demotivierend.
axon
User
Beiträge: 15
Registriert: Donnerstag 23. Juni 2011, 19:21

Entschuldige, habe ich das Problem richtig verstanden?
Wäre es wie folgt simpel genug gelöst?
*ANGST* - sich vor einem Mathematiker zu blamieren :oops:

Code: Alles auswählen

from random import randint as rnd
EINSEN = 0
ANZAHL_DER_SERIEN=10
ANZAHL_DER_WUERFE=10

for i in range(ANZAHL_DER_SERIEN):
    a= [rnd(0, 1)for _ in xrange(ANZAHL_DER_WUERFE)]
    EINSEN += sum(a)
    print i," : ",a

print "\nrel. Haeufigkeit(EINSEN) :", EINSEN*1./(ANZAHL_DER_SERIEN*ANZAHL_DER_WUERFE)
print "rel. Haeufigkeit(NULLEN) :", 1-EINSEN*1./(ANZAHL_DER_SERIEN*ANZAHL_DER_WUERFE)

print "\nabs. Hauefigkeit(EINSEN) :", EINSEN
print "abs. Hauefigkeit(NULLEN) :", ANZAHL_DER_SERIEN*ANZAHL_DER_WUERFE-EINSEN
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

problembär hat geschrieben: Es heißt ja "Softwareentwicklung": Ich denke, man kann nicht erwarten, daß Code, den man hier postet, gleich perfekt ist. Wäre gut, wenn er erstmal überhaupt in sich lauffähig ist. Kann in der ersten Version sogar noch ein paar Bugs haben. Nachdem Fehler behoben sind, kann man unter Umständen nochmal darüber nachdenken, solche Sachen, die vielleicht etwas umständlich oder nicht gut ausgedrückt sind, nochmal besser zu machen.
Man sollte sich beim zugrunde liegenden Algorithmus aber nicht verrennen ;-) Und dieses Beispiel ist sicherlich trivial genug, um nicht gleich über Vorgehensmodelle zu Softwareentwicklung reden zu müssen... zudem habe ich ja genau das gemacht, was Du anmahnst: Ich habe Deinen Ansatz verbessert ;-)
problembär hat geschrieben: Und ihr anderen, universitär Ausgebildeten: Sagt Leuten, die hier Fragen stellen, doch lieber solche wichtigen Sachen, die sie in Python voranbringen (wie das mit dem Teilen durch Integer), anstatt immer nur "Das, was Du da machen willst, geht mit Modul XY, und außerdem ist es sowieso nicht sinnvoll, weil bla, bla, bla."
Das ist sonst nur demotivierend.
Vorhandene Ressourcen zu nutzen ist sinnvoll. Zudem ist das von Dir angesprochene Verhalten ungültig für Python 3 - und das `print` als Funktion deutet darauf hin, dass der Autor Python 3 einsetzt. Insofern gut gemeinter, aber hier falscher Hinweis.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten