Pi berechnung Fehler

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
bertil
User
Beiträge: 8
Registriert: Freitag 15. Januar 2010, 20:15

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))
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.
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

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
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()
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Alternative zu Zeile 5:

Code: Alles auswählen

hits = sum((random()**2 + random()**2) <= 1 for i in xrange(shots))
bertil
User
Beiträge: 8
Registriert: Freitag 15. Januar 2010, 20:15

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.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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)".
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Und verwende am besten das [mod]decimal[/mod] Modul, für eine größer Genauigkeit!
the more they change the more they stay the same
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

:oops: Nicht genau genug gelesen

war das nicht die Monte-Carlo-Methode
the more they change the more they stay the same
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

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?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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".
Benutzeravatar
Käptn Haddock
User
Beiträge: 169
Registriert: Freitag 24. März 2006, 14:27

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
---------------------------------
have a lot of fun!
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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.
the more they change the more they stay the same
Antworten