Zufallsberechnung...ABER RICHTIG!!!

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

boss@future

Betreff: Zufallsberechnung...ABER RICHTIG!!!

BeitragMi, Okt 27, 2004 17:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
ich bin gerade dabei ein programm zu schreiben, dass pi über ein Zufallsprinzip errechnet. Jedoch Ist das programm auf grund der Zufallsfunktion von Blitzbasic zu ungenau. Es werden also in jedem Schleifendurchgang zwei zufallswerte von 0 bis 500 für die koordinaten der Punkte erzeugt. Wenn man sich z.B. 1000 Punkte generieren lässt werden aber nur ca 40 angezeigt, da der zufall so oft die gleichen werte zurückliefert, was aus die kurze dauer des rechenprozesses zurückzuführen ist.

For n= 0 To wiederholungen
SeedRnd MilliSecs()
punkteall# = punkteall#+1
Delay Rnd#(0,2) <---nur optional(verbessert das ergebnis, lässt aber die rechenzeit explodieren)
X = Rand(0,500)
Delay Rnd#(0,2)<---nur optional(verbessert das ergebnis, lässt aber die rechenzeit explodieren)
Y = Rand(0,500)
Plot (X+40), (Y+49)
abstand# = Sqr((X-250)^2 + (y-250)^2)
If abstand <= 250
Punktekreis# = Punktekreis#+1
EndIf
Next

Gibt es eine Funktion, mit der man einen wirklichen Zufallswert von 0-500 errechnen kann? (Der antürlich auch rasch geht (werden so 10000-10000000 Punkte berechnet...))

Wäre dankbar für JEDE Hilfe Very Happy
THX FLO

ps.: auch bei einer Punktezahl von 10000000 Ist das quadrat noch nicht komplett ausgefüllt...außerdem lässt sich ohne delay sehr genaue strukturen erkennen.

D2006

Administrator

BeitragMi, Okt 27, 2004 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm. Wer hat denn gesagt dass bei Zufall jeder Wert nach x Durchläufen einmal drankommt ?

Ich mein es ist halt zufall.

MfG
 

OJay

BeitragMi, Okt 27, 2004 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
ich würd mal das seedrnd() aus der schleife rausnehmen Rolling Eyes


nach 4.000.000 durchläufen entsteht bei mir durchaus ein weißes quadrat...

Code: [AUSKLAPPEN]
Graphics 800,600
SetBuffer FrontBuffer()

wiederholungen = 4000000
SeedRnd MilliSecs()

For n= 0 To wiederholungen
   punkteall# = punkteall#+1
   X = Rand(0,500)
   Y = Rand(0,500)
   Plot (X+40), (Y+49)
   abstand# = Sqr((X-250)^2 + (y-250)^2)
   If abstand <= 250 Punktekreis# = Punktekreis#+1
Next


(man sollte sich immer zuerst an die eigene nase fassen, bevor man anderen, wie z.b. bb, fehler in die schuhe schiebt...aber das nur nebenbei)

Kabelbinder

Sieger des WM-Contest 2006

BeitragMi, Okt 27, 2004 17:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi

Also soweit ich weiß ist Rand() eine richtige ZufallsFunktion, wenn man SeedRnd Millisecs() angibt.

Zitat:
ps.: auch bei einer Punktezahl von 10000000 Ist das quadrat noch nicht komplett ausgefüllt...außerdem lässt sich ohne delay sehr genaue strukturen erkennen.

So wie ich das verstanden habe willst du aus einzelnen Pixel, die zufällig auf dem Bildschirm platziert werden ein quadrat zusammenstellen.

Ich habe sowas auch mal versucht mit einem Algorithmus, den ich von Edlothiol habe. Dieser bringt Werte in Arrays in eine Zufällige Reihenfolge, indem er zuerst Wert 1 mit einem Zufälligen anderen in der Liste tauscht, dann wert 2 usw. bis zum Ende der Liste.

Das mit dem Zufälligen Pixeln habe ich so gemanaget, dass ich das zu zeichnende Bild zuerst auf den Backbuffer gezeichnet habe, und sämtliche Koordinaten die es auf dem Bildschirm gab (per for-Schleife), in einem zweidimensionalen Array gespeichert habe. Diesen habe ich dann wiederum durcheinander gebracht (wobei ich darauf achten musste, das x und y-Koordinate zusammen bleiben). Und anschließend konnte ich per CopyPixel und Zwei For-Schleifen die Pixel dieses Bildes in Zufälliger Reihenfolge auf den Frontbuffer kopieren. Wenn du bock hast, sieh es dir mal an:
Code: [AUSKLAPPEN]
Graphics 640,480,16,1
SetBuffer BackBuffer()
SeedRnd MilliSecs()

Dim font(250)
For i = 200 To 250 Step 5
font(i) = LoadFont("Arial",i,1,0,0)
Color 0,255-(i-200)*4,0
SetFont font(i)
Text 320,240,"Hallo",1,1
Next

d = 0
Dim punkt(308321,2)
For y = 0 To 480
For x = 0 To 640
punkt(d,1) = x
punkt(d,2) = y
d = d + 1
Next
Next

For i = 0 To d
a = Rand(0,d)
z = punkt(a,1)
y = punkt(a,2)
punkt(a,1) = punkt(i,1)
punkt(a,2) = punkt(i,2)
punkt(i,1) = z
punkt(i,2) = y
Next

For i = 0 To d
CopyPixel punkt(i,1),punkt(i,2),BackBuffer(),punkt(i,1),punkt(i,2),FrontBuffer()
Next

WaitKey
End


Ich weiß aber nicht, ob ich die Frage richtig verstanden habe Smile . Aber damit kommt auf jeden Fall bei x werten auch jeder dran.
<Wing Avenger Download> ◊◊◊ <Macrophage Download>

joachim_neu

BeitragMi, Okt 27, 2004 19:12
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn du noch in deiner hauptschleife "seedrnd millisecs()" benutzt, dann ist das so ein zufall, da kommt kein algoritmus dran!
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

BladeRunner

Moderator

BeitragMi, Okt 27, 2004 21:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Grade eben nicht. Das Problem beim ersten Code (und bei deinem Vorschlag, joachim) ist das BB die Hauptschleife in weniger als einer Millisekunde durchläuft. Daher wird der Zufallsgenerator für einige (hundert(?)) Durchläufe mit dem selben Wert initialisiert und gibt daher in all diesen Durchläufen auch immer das selbe Ergebnis aus.
Daher: erst seedrnd millisecs() , dann die Schleife und alles läuft gut. Wink
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Ctuchik

BeitragDo, Okt 28, 2004 0:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Außerdem bezieht BB afaik auch die zuletzt erzeugten Zufallszahlen in die Errechnung der nächsten Zahl mit ein und durch SeedRnd wird das wieder zurückgesetzt, oder?
Zu den Nebenwirkungen gehören trockener Mund, Übelkeit, Erbrechen, Harnstau, schmerzhafter rektaler Juckreiz, Halluzinationen, Demenz, Psychose, Koma, Tod und Mundgeruch!
Magie eignet sich nicht für alle!
Fraget euren Arzt oder Apotheker!

joachim_neu

BeitragDo, Okt 28, 2004 16:11
Antworten mit Zitat
Benutzer-Profile anzeigen
dann speicher halt immer den wert, den millisecs hat, wenn du initialisierst, und wenn der wert anderst ist, initialisierst du neu!
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de
 

OJay

BeitragDo, Okt 28, 2004 16:21
Antworten mit Zitat
Benutzer-Profile anzeigen
jetzt haltet mal die luft an mit euren halb-weisheiten! das problem ist seit 5 posts geklärt...

BladeRunner

Moderator

BeitragDo, Okt 28, 2004 17:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Reg dich doch nicht so auf Ojay.
Und: Geklärt war es mit deiner Antwort, das stimmt. Was ich getan habe war noch dazu zu erklären weshalb das seedrnd ausserhalb der Schleife muss. Wenn man weiss WARUM man etwas ändern muss behält man es eben leichter.

Und ich denke nicht dass meine Antwort eine Halbwahrheit gewesen ist da sie vollkommen korrekt war.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

OJay

BeitragDo, Okt 28, 2004 19:10
Antworten mit Zitat
Benutzer-Profile anzeigen
du warst doch garnicht gemeint...die 5 war nur eine grobe schätzung Razz

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group