Seite 1 von 2

Galton Brett

Verfasst: Dienstag 19. Januar 2010, 10:13
von Blacky
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

Re: Galton Brett

Verfasst: Dienstag 19. Januar 2010, 10:14
von numerix
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 ...

Ansatz

Verfasst: Dienstag 19. Januar 2010, 10:25
von Blacky
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)

Re: Ansatz

Verfasst: Dienstag 19. Januar 2010, 11:52
von /me
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.

Re: Ansatz

Verfasst: Dienstag 19. Januar 2010, 14:40
von derdon
/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.

Re: Ansatz

Verfasst: Dienstag 19. Januar 2010, 14:59
von numerix
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.

Re: Ansatz

Verfasst: Dienstag 19. Januar 2010, 15:11
von Masaru
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<<

Re: Ansatz

Verfasst: Dienstag 19. Januar 2010, 16:05
von numerix
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.

Re: Ansatz

Verfasst: Dienstag 19. Januar 2010, 16:33
von /me
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.

Re: Ansatz

Verfasst: Dienstag 19. Januar 2010, 16:33
von Masaru
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:.

Re: Ansatz

Verfasst: Dienstag 19. Januar 2010, 16:35
von /me
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.

Verfasst: Dienstag 19. Januar 2010, 16:37
von Dav1d
Eine tolle Mischung :P

Code: Alles auswählen

f = lambda x: reduce(__import__('operator').mul, xrange(1, x+1))

Verfasst: Dienstag 19. Januar 2010, 17:00
von 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
:-)

Verfasst: Dienstag 19. Januar 2010, 17:15
von /me
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!

Verfasst: Dienstag 19. Januar 2010, 17:19
von numerix
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.

Verfasst: Dienstag 19. Januar 2010, 17:26
von derdon
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).

Verfasst: Dienstag 19. Januar 2010, 17:28
von Masaru
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 ;).

Verfasst: Dienstag 19. Januar 2010, 17:33
von numerix
Du bist aber giftig heute.

Verfasst: Dienstag 19. Januar 2010, 17:33
von derdon
In Lesbarkeit ist sie das aber, in Performance nicht. numerix hat nicht gesagt, was er mit "überlegen" meinte.

Verfasst: Dienstag 19. Januar 2010, 17:43
von Masaru
*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*