Normalverteilte Zufallszahlen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Little John

Normalverteilte Zufallszahlen

Beitrag von Little John »

xxx
Zuletzt geändert von Little John am 07.05.2010 01:26, insgesamt 5-mal geändert.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten