Zufallsberechnung...ABER RICHTIG!!!
Übersicht

boss@futureBetreff: Zufallsberechnung...ABER RICHTIG!!! |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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. |
||
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hmm. Wer hat denn gesagt dass bei Zufall jeder Wert nach x Durchläufen einmal drankommt ?
Ich mein es ist halt zufall. MfG |
||
OJay |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ich würd mal das seedrnd() aus der schleife rausnehmen ![]() 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) |
||
![]() |
KabelbinderSieger des WM-Contest 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
<Wing Avenger Download> ◊◊◊ <Macrophage Download> |
![]() |
joachim_neu |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
jetzt haltet mal die luft an mit euren halb-weisheiten! das problem ist seit 5 posts geklärt... | ||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
du warst doch garnicht gemeint...die 5 war nur eine grobe schätzung ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group