Seite 1 von 1

Pi berechnung Fehler

Verfasst: Dienstag 20. April 2010, 16:50
von bertil
Moin,
Grr. Manchmal hasse ich Python.
Ich habe mir ein Programm (s.u.) zur Berechnung von Pi geschrieben. keine große sache.

Aber mein ergebnis ist immer 0 (in Worten: Null).
obwoh ich, wenn ich mir die Variablen ausgeben lasse und per hand rechne, definitiv nicht null herausbekomme.

Danke fürs erklären.

Code: Alles auswählen

import random
t=i=0
s=int(input('schusszahl eingeben'))

while i <= s:
    x = random.random()
    y = random.random()
    if x*x + y*y <= 1:
        t+=1
    i+=1

print('PI: '+str((t/s)*4))

Verfasst: Dienstag 20. April 2010, 16:56
von BlackJack
@bertil: `t` und `s` sind vom Typ `int` dass heist da kommt bei einer Division (bei Python 2.x) auch wieder eine ganze Zahl heraus.

Verfasst: Dienstag 20. April 2010, 17:04
von HerrHagen
Das heißt du musst entweder mit floats rechnen:

Code: Alles auswählen

t=i=0.
s=float(input('schusszahl eingeben'))
oder das Divisionsverhalten ändern:

Code: Alles auswählen

from __future__ import division
MFG HerrHagen

Verfasst: Dienstag 20. April 2010, 17:07
von BlackJack
@bertil: Die kurzen Namen und die ``while``-Schleife sind ausserdem nicht so elegant.

Code: Alles auswählen

from random import random

def main():
    shots = int(raw_input('Schusszahl eingeben: '))
    hits = sum(1 for dummy in xrange(shots) if (random()**2 + random()**2) <= 1)
    print 'Pi: %f' % (4.0 * hits / shots)

if __name__ == '__main__':
    main()

Verfasst: Dienstag 20. April 2010, 17:13
von numerix
Alternative zu Zeile 5:

Code: Alles auswählen

hits = sum((random()**2 + random()**2) <= 1 for i in xrange(shots))

Verfasst: Dienstag 20. April 2010, 17:21
von bertil
Ok, danke Leute. Typische Anfänger-Fehler halt, aber was soll ich als ein solcher machen?!

Frage(n):
wenn ich den input floate kann ich ihn ja nicht in ner for-schleife nehmen. Das kann man mit "raw_input" umgehen oder wie?
und was heißt das xrange bei ner for-schleife? also wo ist der Unterschied?

anders gesagt: Wo finde ich gut erklärte Erklärungen von den ganzen Operatoren? Google spuck nur teils unverständliche erklärungen aus. ;)

@ numerix
sehr elegant. Aber sowas lernt man heutzutage in der Schule leider nicht...genauso wie wir lernen, möglichst kurze, deutsche Variablen zu nehmen. Naja. Unjser Lehrer mag kein Englisch.

Verfasst: Dienstag 20. April 2010, 17:31
von Darii
bertil hat geschrieben:Ok, danke Leute. Typische Anfänger-Fehler halt, aber was soll ich als ein solcher machen?!
Probieren probieren probieren. In diesem Fall hättest du zum Beispiel die Programmschritte einzeln nachvollziehen können (entweder per Debugger oder Terminal), dann wärst du irgendwann von selbst auf das Divisionsproblem gestoßen und hättest dann evtl andere Fragen stellen können.
Frage(n):
wenn ich den input floate kann ich ihn ja nicht in ner for-schleife nehmen. Das kann man mit "raw_input" umgehen oder wie?
?
und was heißt das xrange bei ner for-schleife? also wo ist der Unterschied?

anders gesagt: Wo finde ich gut erklärte Erklärungen von den ganzen Operatoren? Google spuck nur teils unverständliche erklärungen aus. ;)
Im FM von RTFM ;) http://docs.python.org/tutorial/control ... statements und http://docs.python.org/library/functions.html#xrange

Verfasst: Dienstag 20. April 2010, 17:32
von numerix
bertil hat geschrieben:@ numerix
sehr elegant. Aber sowas lernt man heutzutage in der Schule leider nicht...genauso wie wir lernen, möglichst kurze, deutsche Variablen zu nehmen.
Die Eleganz war von BlackJack - ich habe nur etwas gekürzt ...

Gegen deutsche Bezeichner spricht im schulischen Bereich auch gar nichts; und kurz ist auch nicht grundsätzlich schlecht. Aber ein Bezeichner sollte möglichst so sein, dass er Auskunft über seine Bedeutung gibt.

Die Lösung für dich könnte einfach so aussehen, dass du bei der abschließenden Berechnung z.B. nicht "t/s" schreibst, sondern "t/float(s)".

Verfasst: Dienstag 20. April 2010, 17:39
von Dav1d
Und verwende am besten das [mod]decimal[/mod] Modul, für eine größer Genauigkeit!

Verfasst: Dienstag 20. April 2010, 17:45
von numerix
Dav1d hat geschrieben:Und verwende am besten das [mod]decimal[/mod] Modul, für eine größer Genauigkeit!
Das ist - mit Verlaub gesagt - Quatsch. Bei der hier gezeigten Approximation von Pi handelt es sich um das sog. Buffonsche Nadelprobleme, ein stochastisches Verfahren, das zwar interessant sein mag, aber ohnehin keine wirklich brauchbare Genauigkeit für Pi liefert.

Verfasst: Dienstag 20. April 2010, 17:59
von Dav1d
:oops: Nicht genau genug gelesen

war das nicht die Monte-Carlo-Methode

Verfasst: Dienstag 20. April 2010, 18:55
von bords0
numerix hat geschrieben:Bei der hier gezeigten Approximation von Pi handelt es sich um das sog. Buffonsche Nadelprobleme, ein stochastisches Verfahren, das zwar interessant sein mag, aber ohnehin keine wirklich brauchbare Genauigkeit für Pi liefert.
Verfahren des OP kenne ich eher nicht als Buffonsches Nadelproblem. Bei letzterem werden üblicherweise "Baguettes" (heutzutage eher Nadeln) auf den Boden mit parallelen Linien geworfen, nicht Punkte in ein Quadrat mit Kreis. Nennt man das heutzutage auch Buffonsches Nadelproblem?

Verfasst: Mittwoch 21. April 2010, 07:59
von numerix
bords0 hat geschrieben:Verfahren des OP kenne ich eher nicht als Buffonsches Nadelproblem. Bei letzterem werden üblicherweise "Baguettes" (heutzutage eher Nadeln) auf den Boden mit parallelen Linien geworfen, nicht Punkte in ein Quadrat mit Kreis. Nennt man das heutzutage auch Buffonsches Nadelproblem?
Wahrscheinlich nicht. Richtiger wäre gewesen: "Ein Verfahren ähnlich dem Buffonschen Nadelproblem".

Verfasst: Mittwoch 21. April 2010, 09:29
von Käptn Haddock
numerix hat geschrieben: Bei der hier gezeigten Approximation von Pi handelt es sich um das sog. Buffonsche Nadelprobleme, ein stochastisches Verfahren, das zwar interessant sein mag, aber ohnehin keine wirklich brauchbare Genauigkeit für Pi liefert.
Es ist die Monte-Carlo-Methodik, die hier angewendet wird. Im Gegensatz zum Nadelproblemlassen damit durchaus brauchbare Ergebnisse produzieren, wenn man solchen Schrotschußstatistiken überhaupt Glauben schenken will ;)

CU Uwe

Verfasst: Freitag 23. April 2010, 13:35
von Dav1d
Ich habe mal auf mehrere Art und Weisen PI berechnet, die Monte-Carlo-Methode hat funktioniert, allerdings braucht man sehr viele "Durchgänge" (Zufallszahlen) bis sie sich PI einigermaßen annähert.