Normalverteilte Zufallszahlen
Normalverteilte Zufallszahlen
xxx
Zuletzt geändert von Little John am 07.05.2010 01:26, insgesamt 5-mal geändert.
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Mamma Mia! ...dass ich nicht selbst auf die Idee gekommen bin...
...da muss ich doch gleich mal prüfen, ob das am end schneller ist, als meine simulierte Normalverteilung...
...drückt mir die Daumen, dass die Forensuche mich nicht im Stich läßt...
...da muss ich doch gleich mal prüfen, ob das am end schneller ist, als meine simulierte Normalverteilung...
...drückt mir die Daumen, dass die Forensuche mich nicht im Stich läßt...

Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
so habs gefunden... ich hatte es hier im Board garnicht gepostet damals...
also, mangels einer nativen Normalverteilten Randomfunktion habe ich mich hingesetzt und eine Glockenkurve simuliert.
dazu benutze ich nen Sinus, der einer Glockenkurve ja zumindest optisch ein wenig ähnelt.
hier das Ganze als Procedure:
und natürlich gibts ein paar Demos dazu:
Demo der linearen Verteilung des Standard-Random:
auf die gleiche Weise
Demo der Bogenförmigen Verteilung der Gauss-Simulation:
Demo mit 2D-Effekt:
Demo mit 3D-Effekt:
also, mangels einer nativen Normalverteilten Randomfunktion habe ich mich hingesetzt und eine Glockenkurve simuliert.
dazu benutze ich nen Sinus, der einer Glockenkurve ja zumindest optisch ein wenig ähnelt.
hier das Ganze als Procedure:
Code: Alles auswählen
Procedure.l GauRand(Range.l)
Range2 = Range / 2
PiHalf.f = #PI / 2
Prec = 500000
Z = Range2 + Range2 * (ASin( (Random(Prec*2) - Prec ) / Prec ) / PiHalf)
ProcedureReturn Z
EndProcedure
Demo der linearen Verteilung des Standard-Random:
Code: Alles auswählen
InitSprite()
InitKeyboard()
OpenScreen( 1024, 768, 32, "RandomDemo" )
Dim Field( 1024 )
Repeat
ExamineKeyboard()
For n=0 To 50
Z = Random(1023)
Field(Z)+1
Next
StartDrawing(ScreenOutput())
FrontColor($FF8000)
For n=0 To 1023
Line(n, 767, 0, -Field(n) )
Next
StopDrawing()
Delay(0)
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
Demo der Bogenförmigen Verteilung der Gauss-Simulation:
Code: Alles auswählen
InitSprite()
InitKeyboard()
OpenScreen( 1024, 768, 32, "GaussDemo1" )
Dim Field( 1024 )
Prec = 500000
Range = 1024
Range2 = Range / 2
PiHalf.f = #PI / 2
Repeat
ExamineKeyboard()
For n=0 To 50
Z = Range2 + Range2 * (ASin( (Random(Prec*2) - Prec ) / Prec ) / PiHalf)
Field(Z)+1
Next
StartDrawing(ScreenOutput())
FrontColor($FF8000)
For n=0 To 1023
Line(n, 767, 0, -Field(n) )
Next
StopDrawing()
Delay(0)
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
Code: Alles auswählen
InitSprite()
InitKeyboard()
OpenScreen( 1024, 768, 32, "GaussDemo2" )
Dim Field( 768,768 )
Dim Col(128)
For n=0 To 31 : t = n*8
Col(n ) = RGB( 0, 0, t)
Col(n+32) = RGB( t, 0, 255-t)
Col(n+64) = RGB( 255, t, 0)
Col(n+96) = RGB( 255, 255, t)
Next
Prec = 500000
Range = 768
Range2 = Range / 2
PiHalf.f = #PI / 2
Repeat
ExamineKeyboard()
For n=0 To 25000
X = Range2 + Range2 * (ASin( (Random(Prec*2) - Prec ) / Prec ) / PiHalf)
Y = Range2 + Range2 * (ASin( (Random(Prec*2) - Prec ) / Prec ) / PiHalf)
If Field(X,Y)<127 : Field(X,Y)+1 : EndIf
Next
StartDrawing(ScreenOutput())
For t=0 To 767
For n=0 To 767
Plot( 128+n, t, Col(Field(n,t)))
Next
Next
B = 1 - B : If B : Line(0,0,32,0,$FF0000) : Else : Line(0,0,32,0,$0000FF) : EndIf
StopDrawing()
Delay(0)
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
Code: Alles auswählen
InitSprite()
InitKeyboard()
OpenScreen( 1024, 768, 32, "GaussDemo3" )
Dim Field( 512,512 )
Dim Col(224)
For n=0 To 31 : t = n*8
Col(n ) = RGB( t, 0, 0)
Col(n+ 32) = RGB( 255, t, 0)
Col(n+ 64) = RGB( 255-t, 255, 0)
Col(n+ 96) = RGB( 0, 255, t)
Col(n+128) = RGB( 0, 255-t, 255)
Col(n+160) = RGB( t, 0, 255)
Col(n+192) = RGB( 255, t, 255)
Next
Prec = 500000
Range = 512
Range2 = Range / 2
PiHalf.f = #PI / 2
Repeat
ExamineKeyboard()
ClearScreen(0,0,0)
For n=0 To 15000
X = Range2 + Range2 * (ASin( (Random(Prec*2) - Prec ) / Prec ) / PiHalf)
Y = Range2 + Range2 * (ASin( (Random(Prec*2) - Prec ) / Prec ) / PiHalf)
If Field(X,Y)<223 : Field(X,Y)+1 : EndIf
Next
StartDrawing(ScreenOutput())
For t=0 To 511
For n=0 To 511
X = 470 + (n*2/3) - (t/2)
Y = 300 + (n/3) + (t/2)
z=Field(n,t)
Plot( X, Y-z, Col(z))
Next
Next
B = 1 - B : If B : Line(0,0,32,0,16711680) : Else : Line(0,0,32,0,255) : EndIf
StopDrawing()
Delay(0)
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.