Galton Brett

Du hast eine Idee für ein Projekt?
Blacky
User
Beiträge: 3
Registriert: Dienstag 19. Januar 2010, 10:10

Hi hat jemand ne Idee wie man ein Galton Brett mit Python macht. Wäre echt nett wenn jemand hier nen Quelltext oder Tipps geben könnte
mfg
Herbert 8) :D
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Blacky hat geschrieben:Hi hat jemand ne Idee wie man ein Galton Brett mit Python macht. Wäre echt nett wenn jemand hier nen Quelltext oder Tipps geben könnte
mfg
Herbert 8) :D
Der Weg ist ein anderer: DU sagst, welche Ideen du bisher hattest und zeigst möglichst auch schon einen Code-Ansatz dazu. Dann bekommst du sicher Hinweise, ob und was man besser machen könnte ...
Blacky
User
Beiträge: 3
Registriert: Dienstag 19. Januar 2010, 10:10

Ok hier ist mein Ansatz: Wusste ich nicht das das so geht sry.
import random
def galton(r, l):
print "galton(", r, ",", l, ")"
if r < l:
return None
else:
if (l == 0) or (r == l):
return 1
else:
return (galton(r-1, l-1) + galton(r-1, l))
galton(0, 2)
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Blacky hat geschrieben:Ok hier ist mein Ansatz: Wusste ich nicht das das so geht sry.

Code: Alles auswählen

import random
def galton(r, l):
    print "galton(", r, ",", l, ")"
    if r < l:
        return None
    else:
        if (l == 0) or (r == l):
            return 1
        else:
            return (galton(r-1, l-1) + galton(r-1, l))
galton(0, 2)
Du importierst random, nutzt es aber nicht. Möchtest du jetzt die Kugeln zufällig durchlaufen lassen oder möchtest du die mathematische Wahrscheinlichkeit ermitteln? Für zweiteres habe ich mal eben folgenden Code erstellt:

Code: Alles auswählen

def get_probability(rows_total, slot_number):
    def fak(value):
        [... 4 Zeilen Code aus Lerngründen entfernt ...]
    
    def n_over_k(n, k):
        [... 1 Zeile Code aus Lerngründen entfernt ...]
    
    nok = n_over_k(rows_total, slot_number)
    return nok * (1.0 / 2 ** rows_total)

rows = 4
slots = [get_probability(rows, i) for i in range(rows + 1)]
print(slots)
Dein Ansatz klingt eher nach der ersten beschriebenen Vorgehensweise, aber du solltest noch mal deutlich machen was du genau möchtest und was das Ergebnis sein soll.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

/me hat geschrieben:

Code: Alles auswählen

def get_probability(rows_total, slot_number):
    def fak(value):
        [... 4 Zeilen Code aus Lerngründen entfernt ...]
    
    def n_over_k(n, k):
        [... 1 Zeile Code aus Lerngründen entfernt ...]
    
    nok = n_over_k(rows_total, slot_number)
    return nok * (1.0 / 2 ** rows_total)

rows = 4
slots = [get_probability(rows, i) for i in range(rows + 1)]
print(slots)
Warum 4 Zeilen für fak?

Code: Alles auswählen

from operator import mul
def fac(num):
    return reduce(mul, xrange(1, num+1))
reicht doch auch.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

derdon hat geschrieben: Warum 4 Zeilen für fak?

Code: Alles auswählen

from operator import mul
def fac(num):
    return reduce(mul, xrange(1, num+1))
reicht doch auch.
Viel zu lang ... :wink:

Code: Alles auswählen

f=lambda x:x*f(x-1)if x else 1
reicht doch auch.
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

numerix hat geschrieben:
derdon hat geschrieben: Warum 4 Zeilen für fak?

Code: Alles auswählen

from operator import mul
def fac(num):
    return reduce(mul, xrange(1, num+1))
reicht doch auch.
Viel zu lang ... :wink:

Code: Alles auswählen

f=lambda x:x*f(x-1)if x else 1
reicht doch auch.
Viel zu unverständlich und sieht noch dazu echt ugly aus.

Code: Alles auswählen

import this
>>Masaru<<
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Masaru hat geschrieben:Viel zu unverständlich und sieht noch dazu echt ugly aus.
Sehe ich nicht so. Es ist eine saubere, simple Umsetzung der rekursiven Definition der Fakultät. Und der "reduce - mul - xrange"-Variante an Verständlichkeit ganz gewiss überlegen.

@Blacky: Was genau soll deine Simulation denn leisten? Soll der ganze Prozess für eine bestimmte Anzahl an Kugeln quasi parallel simuliert werden? Soll dann für jede Zeile angezeigt werden, wie viele Kugeln sich in den einzelnen "Bahnen" gerade befinden oder genügt der Endzustand. Oder soll jeweils immer nur der Lauf einer Kugel simuliert werden und gezeigt werden, in welches Kästchen sie fällt?

Ohne eine klare Beschreibung, was du unter "Galton Brett mit Python machen" verstehst, wird man dir nicht helfen können.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

derdon hat geschrieben:Warum 4 Zeilen für fak?

Code: Alles auswählen

from operator import mul
def fac(num):
    return reduce(mul, xrange(1, num+1))
reicht doch auch.
Nun, die 4 Zeilen liegen wohl in erster Linie daran, dass 25 Jahre mit anderen Programmiersprachen so schwer aus dem Kopf gehen. :wink:

reduce() war mir beim Schreiben geistig einfach nicht präsent.
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

numerix hat geschrieben:.... Und der "reduce - mul - xrange"-Variante an Verständlichkeit ganz gewiss überlegen. ....
Das sehe ich wiederrum nicht so ... Deine lambda-Variante mag zwar eine "Alternative" sein, aber ist sie mit Sicherheit nicht "überlegen": völliger Quatsch :lol:.
Zuletzt geändert von Masaru am Dienstag 19. Januar 2010, 16:37, insgesamt 1-mal geändert.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

numerix hat geschrieben:

Code: Alles auswählen

f=lambda x:x*f(x-1)if x else 1
Nettes Beispiel, aber ein Entwickler der die Fakultät ernsthaft via Rekursion berechnet gehört geteert und gefedert.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Eine tolle Mischung :P

Code: Alles auswählen

f = lambda x: reduce(__import__('operator').mul, xrange(1, x+1))
the more they change the more they stay the same
BlackJack

@numerix: Aber das ist so rekursiv. Würde ich in Python nicht verwenden.

Aber warum überhaupt die Fakultät implementieren:

Code: Alles auswählen

import gmpy
n_over_k = gmpy.bincoef
:-)
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

BlackJack hat geschrieben:Aber warum überhaupt die Fakultät implementieren:

Code: Alles auswählen

import gmpy
n_over_k = gmpy.bincoef
:-)
Ha, wieder was gelernt. Merci!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

BlackJack hat geschrieben:@numerix: Aber das ist so rekursiv. Würde ich in Python nicht verwenden.
Das sollte auch kein Beispiel für eine performante Implementation sein. Es ging in dem Zusammenhang ja um die Kürze des Codes und ich bin nach wie vor der Ansicht, dass das mal ein Beispiel ist, dass ein Code kurz UND verständlich sein kann (auch wenn Masaru das für "Quatsch" hält). Aus meiner Sicht ist das ein Stück eleganter Code (klingt natürlich doof, wenn man es selbst präsentiert, aber ich bin nicht mal sicher, ob ich das nicht mal woanders gesehen habe und davon inspiriert wurde).

Natürlich sieht eine performante Implementierung anders aus. Vor einiger Zeit habe ich mal eine äußerst interessante Seite dazu gefunden, wo jemand die Fakultät zu seinem Hobby gemacht hat. Das ist eine echte Fundgrube und es ist wirklich erstaunlich, wie effizient man die Fakultät (für große n) berechnen kann - die Algorithmen passen dann aber auch nicht mehr in eine Zeile ... :cry:
BlackJack hat geschrieben:Aber warum überhaupt die Fakultät implementieren:
Weil es Spaß macht. :wink: Wem es keinen macht:

Code: Alles auswählen

from math import factorial
Edit: Natürlich braucht man für das Galtonbrett überhaupt keine Fakultät und auch keine Binomialkoeffizienten - da kommt man auch mit reiner Addition aus.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Ich finde die Variante von numerix elegant und leserlich. Dass sie kurz ist, wird wohl keiner bestreiten können. Meine dagegen ist unleserlicher; der einzige Vorteil liegt in Performance und Speicherverbrauch (sehe ich als einen Punkt).
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

numerix hat geschrieben:... auch wenn Masaru das für "Quatsch" hält...
Whop, ich habe lediglich gesagt, dass Deine Aussage die "lambda-Variante wäre überlegen" völliger Quatsch sei. Wer lesen kann ist klar im Vorteil ;).
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Du bist aber giftig heute.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

In Lesbarkeit ist sie das aber, in Performance nicht. numerix hat nicht gesagt, was er mit "überlegen" meinte.
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

*popcornkau* doch, und zwar meine in Punkto "Verständlichkeit" ... was lambda jedoch nie sein wird. Falls Du mir zeigen kannst, wo etwas Gegenteiliges steht, dann ziehe ich meinen Hut und nehme alles mit tiefster Demütigung und Entschuldigung zurück.

@numerix: wann war ich denn mal nicht giftig? *grübel*
Antworten