Seite 1 von 1

Normalverteilte Zufallszahlen

Verfasst: 25.06.2008 13:14
von Little John
xxx

Verfasst: 25.06.2008 17:02
von Kaeru Gaman
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... :mrgreen:

Verfasst: 26.06.2008 13:36
von Kaeru Gaman
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:

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
und natürlich gibts ein paar Demos dazu:

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)
auf die gleiche Weise
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)
Demo mit 2D-Effekt:

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)
Demo mit 3D-Effekt:

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)