Näherung an Pi funktioniert nicht
Übersicht

![]() |
MCWulfBetreff: Näherung an Pi funktioniert nicht |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo!
Ich muss für den Mathe-Unterricht gerade ein Programm schreiben, bei dem um einen Viertel-Kreis ein Quadrat gelegt wird und dann zufällig "Sandkörner" draufgestreut werden. Wenn man die Anzahl der Sandkörner im Kreis mit der Anzahl de Sandkörner im Rest teilt, soll man sich Pi nähern... Blos ich komme mit meinem Code auf 3.6 - 3.7 ... Warum? Stimmt da was nicht? Code: [AUSKLAPPEN] ;Fenster öffnen Graphics 640,480,32,2 SetBuffer BackBuffer() ;Deklarationen Global Radius=200 Global RadiusS=5 Global Interv=1 Global Sandkoernerzahl% Global DavonKreis% Global DavonRect% Global Auswahl%=1 Global Go=0 Global LastMilliSek% Global TempX# Global TempY# ;Viertelkreis+Quadrat+Umrandungen zeichnen Color 20,150,200 Rect 20, 20, Radius,Radius, 1 Color 255,255,255 Rect 20, 0, Radius,Radius+20, 0 Color 50, 200,100 Oval 20, -radius+20, Radius*2,Radius*2,1 Color 255,255,255 Oval 20, -radius+20, Radius*2,Radius*2,0 Rect 20,20,radius,radius,0 Color 0,0,0 Rect 0,0,640,20,1 Rect 20+radius,0,radius+21,480,1 ;Zufallszahlen zufällig machen SeedRnd(MilliSecs()) ;Beginn der Schleife While Not KeyHit(1) ;Text anzeigen Color 0,0,0 Rect 20+radius+245,0,640,95 Color 255,255,255 Text 20+radius+50,20,"Sandkörner:" Text 20+radius+250,20,Sandkoernerzahl Text 20+radius+50,40,"Davon im Viertel-Kreis:" Text 20+radius+250,40,DavonKreis Text 20+radius+50,60,"Davon im Rest-Viereck:" Text 20+radius+250,60,DavonRect Text 20+radius+50,80,"Daraus ergebendes Pi:" If davonrect=0 Then Text 20+radius+250,80,"---" ;Falls 0 Sandkörner im Quadrat sind nicht 'Durch Null' rechnen! Else Text 20+radius+250,80,Float(DavonKreis)/Float(DavonRect) EndIf ;Optionen anzeigen und bearbeiten If KeyHit(200) Then Auswahl=Auswahl-1 If KeyHit(208) Then Auswahl=Auswahl+1 If Auswahl < 1 Then Auswahl=4 If Auswahl > 4 Then Auswahl=1 If Auswahl=1 Then Color 255,100,100 If KeyDown(205) And radius < 325 Then Radius=Radius+1 NeuZeichnenUndZuruecksetzen EndIf If KeyDown(203) And Radius > 50 Then Radius=Radius-1 NeuZeichnenUndZuruecksetzen EndIf Else Color 255,255,255 EndIf Text 20+radius+50,120,"Radius:" Text 20+radius+250,120,Radius If Auswahl=2 Then Color 255,100,100 If KeyDown(205) And RadiusS<100 Then RadiusS=RadiusS+1 NeuZeichnenUndZuruecksetzen EndIf If KeyDown(203) And RadiusS>1 Then RadiusS=RadiusS-1 NeuZeichnenUndZuruecksetzen EndIf Else Color 255,255,255 EndIf Text 20+radius+50,140,"Radius Sandkörner:" Text 20+radius+250,140,RadiusS If Auswahl=3 Then Color 255,100,100 If KeyDown(205) And interv < 2000 Then Interv=Interv+1 NeuZeichnenUndZuruecksetzen EndIf If KeyDown(203)And interv > 1 Then Interv=Interv-1 NeuZeichnenUndZuruecksetzen EndIf If KeyHit(203) And interv >0 Then interv=interv-1 neuzeichnenundzuruecksetzen EndIf Else Color 255,255,255 EndIf Text 20+radius+50,160,"Intervall (ms):" If interv > 0 Then Text 20+radius+250,160,Interv ElseIf interv = 0 Then Text 20+radius+250,160,"Turbo" EndIf Color 0,0,0 Rect 20+radius+40,175,20+radius+150,195 If Auswahl=4 Then Color 255,100,100 If KeyHit(28) Then Select go Case 0 go=1 lastmillisek=MilliSecs() Case 1 go=0 End Select EndIf Else Color 255,255,255 EndIf If Go = 0 Then Text 20+radius+50,180,"Start" Else Text 20+radius+50,180,"Stop" EndIf If go=1 Then If interv > 0 Then If MilliSecs()-lastmillisek >=interv Then tempX#=Rnd(20,(20+radius)) tempY#=Rnd(20,(20+radius)) Sandkoernerzahl=Sandkoernerzahl+1 If (tempX-(radius+20.0))^2+(tempy-20.0)^2 < radius^2 Then Color 0,100+Rnd(-30,30),0 davonkreis=davonkreis+1 Else Color 0,0,255+Rnd(-60,0) davonrect=davonrect+1 EndIf Oval tempX-radiuss/2,tempY-radiuss/2,radiuss,radiuss,1 lastmillisek=MilliSecs() EndIf Else If interv=0 Then tempa=100 For i = 1 To tempa tempX#=Rnd(20,(20+radius)) tempY#=Rnd(20,(20+radius)) DebugLog tempx+" "+tempy Sandkoernerzahl=Sandkoernerzahl+1 If (tempX-(radius+20.0))^2+(tempy-20.0)^2 < radius^2 Then Color 0,100+Rnd(-30,30),0 davonkreis=davonkreis+1 DebugLog " =>Im Kreis" Else Color 0,0,255+Rnd(-60,0) davonrect=davonrect+1 DebugLog " =>Im Rest" EndIf Oval tempX-radiuss/2,tempY-radiuss/2,radiuss,radiuss,1 lastmillisek=MilliSecs() Next EndIf EndIf ;Buffer flippen Flip Wend ;Ende der Schleife ;Funktion zum Neuzeichnen der Figur und Zurücksetzen der Sandkörner Function NeuZeichnenUndZuruecksetzen() Cls Color 20,150,200 Rect 20, 20, Radius,Radius, 1 Color 255,255,255 Rect 20, 0, Radius,Radius+20, 0 Color 50, 200,100 Oval 20, -radius+20, Radius*2,Radius*2,1 Color 255,255,255 Oval 20, -radius+20, Radius*2,Radius*2,0 Rect 20,20,radius,radius,0 Color 0,0,0 Rect 0,0,640,20,1 Rect 20+radius,0,radius+21,480,1 sandkoernerzahl=0 davonkreis=0 davonrect=0 Color 255,255,255 Text 20+radius+50,20,"Sandkörner:" Text 20+radius+250,20,Sandkoernerzahl Text 20+radius+50,40,"Davon im Viertel-Kreis:" Text 20+radius+250,40,DavonKreis Text 20+radius+50,60,"Davon im Rest-Viereck:" Text 20+radius+250,60,DavonRect Text 20+radius+50,80,"Daraus ergebendes Pi:" If davonrect=0 Then Text 20+radius+250,80,"---" Else Text 20+radius+250,80,Float(DavonKreis)/Float(DavonRect) EndIf If Auswahl=1 Then Color 255,100,100 Else Color 255,255,255 EndIf Text 20+radius+50,120,"Radius:" Text 20+radius+250,120,Radius If Auswahl=2 Then Color 255,100,100 Else Color 255,255,255 EndIf Text 20+radius+50,140,"Radius Sandkörner:" Text 20+radius+250,140,RadiusS If Auswahl=3 Then Color 255,100,100 Else Color 255,255,255 EndIf Text 20+radius+50,160,"Intervall (ms):" If interv > 0 Then Text 20+radius+250,160,Interv ElseIf interv = 0 Then Text 20+radius+250,160,"Turbo" EndIf Color 0,0,0 Rect 20+radius+40,175,20+radius+150,195 If Auswahl=4 Then Color 255,100,100 Else Color 255,255,255 EndIf If Go = 0 Then Text 20+radius+50,180,"Start" Else Text 20+radius+50,180,"Stop" EndIf go=0 End Function Vielen herzlichen Dank schonmal! |
||
Timo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
warum der Code jetzt nicht klappt, weiß ich nicht, aber ich habe so etwas auch mal gemacht ![]() Hier der code: (du brauchst dafür das Bild, was ich unten angefügt habe) BlitzBasic: [AUSKLAPPEN]
Das benötigte Bild. (*.bmp, 468.8 KB) |
||
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hossa.
~BEITRAG EDITIERT~ Die BB-Syntax Tags sind sehr langsam, was sich vorallem bei langen Codes bemerkbar macht. Habe im ersten Post gute alte [ code ] Tags eingefügt. ~BEITRAG EDITIERT~ Ein >400 KB ist allein im Interesse der Modemuser bitte zu verlinken. Übrigens kann BB so ein Bild mit ~5 Zeilen selbst erzeugen. MfG D2006 |
||
![]() |
MCWulf |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ah, ok, danke, werd ich mir für nächstes mal merken ![]() @Timo: Ja, so kann man es auch machen, blos leider muss ich es mit dem Monte-Carlo-Verfahren machen... Aber warum funkt das nicht? Mein Mathe-Lehrer hat sich das heute mal in der Schule angeschaut und würde sagen, dass das ganze Random-Zeugs in Blitz(3D) nicht so korrekt arbeitet... Könnte es das sein? Wenn nein, woran liegts dann? |
||
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe mir deinen Code nicht genau angesehen, sondern mal eine eigene Version gecodet
Vielleicht erkennst du ja selbst einen fehler BlitzBasic: [AUSKLAPPEN] SeedRnd MilliSecs() da kommen bei mir etwas genauere Werte bei raus! |
||
[BB2D | BB3D | BB+]
|
![]() |
MCWulf |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ahja, du berechnest es anders, jetzt hab ichs bei mir auch umgeändert, jetzt funkts auch auf einmal... Sehr komisch, aber vielen herzlichen Dank!!! ![]() |
||
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kein Problem! | ||
[BB2D | BB3D | BB+]
|
Wilhelm |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo,
Dein Programm ist gut gemacht, aber Deine Berechnungsformel stimmt nicht. Du darfst nicht die Treffer im Viertelkreis durch die Treffer im Rest teilen, das ergibt tatsächlich ungefähr 3,7. Stattdessen müssen die Treffer im Viertelkreis durch die Gesamttreffer geteilt und mit 4 malgenommen werden. WiB |
||
![]() |
Kalex |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi Mcwulf.
Wenn das Programm funktioniert kannst du ja an Tonny´s PI-Wettbewerb mitmachen. Dann müsste dein Programm aber PI bis 1000000 Stellen hinter dem Komma berechnen können. MFG DS |
||
My Fantasy Story:
Reich der Drachen |
![]() |
MCWulf |
![]() Antworten mit Zitat ![]() |
---|---|---|
^^ Ja, allerdings is diese methode ... ... etwas ... ^^ ungenau... und dauert auch ... ... etwas ... ^^ lange, falls man mal 4 stellen nach dem komma genau haben will ^^ | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group