anpera.net

anpera.net

experimental server @home
Aktuelle Zeit: Mi 20 Feb, 2019 02:51

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Normalverteilte Zufallszahlen
BeitragVerfasst: Fr 04 Jul, 2008 17:50 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3898
Wohnort: Basel
Geschlecht: Männlich
Für etwas bestimmtes habe ich eine Normalverteilte Zufallszahl gebraucht. mt_rand() ist linear verteilt, e_rand() verringert einfach nur die beiden Extreme um die Hälfte. Ich brauchte allerdings einen Algorythmus, der, beispielsweise, innert einer Range von 0 bis 9 am meisten 5 zurück gibt - eben normalverteilt.
Da ich es nun mit der Box-Muller-Methode geschafft habe, das zu vollbringen, will ich euch die Funktion nicht vorenthalten - vielleicht kann sie irgendjemand ja brauchen.

Code:
function gauss_rand($min, $max) {   
   // Normalverteilte Zufallszahl zwischen $min und $max
   // Nach der Box-Muller-Methode
   $randmax = 99999;
   $average = ($min+$max / 2);
   $varianz = $max - $average;
   
   do {
      do {
         $u1 = rand(0, $randmax) / $randmax;
         $u2 = rand(0, $randmax) / $randmax;                   
         
         $x = sqrt(-2 * log($u1)) * cos(2 * pi() * $u2);
      } while (strval($x) == "1.#INF" or strval($x) == "-1.#INF");
      
      $var = $x*sqrt($varianz) + $average;
   } while ( $var <= $min OR $var >= $max );
   
   return round($var, 0);
}


Anwendung ist analog zu e_rand() oder mt_rand():

Code:
$zufallszahl = gauss_rand(0, 9);


Die Verteilung (100'000 durchläufe):
Zitat:
0: 1.349%
1: 5.077%
2: 9.783%
3: 15.228%
4: 18.674%
5: 18.63%

6: 15.141%
7: 9.813%
8: 4.986%
9: 1.319%


Die Fett-Markierten Zahlen sind die statistischen Mittel (Eigentlich ist es 4,5).

Edit: Gut, so ganz richtig normalverteilt sind sie nicht. Zumindest nicht, wenn man eine Range zwischen 0 und 100 verwendet und die Werte Grafisch auswertet - die halblogerithmische Kurve ist nicht ganz Rund ;)
Zudem empfielt sich die Funktion nicht für Ranges > 40, da ansonsten die Extrem-Werte extrem selten vorkommen. Bei einer Range zwischen 0 und 100 kamen auf 1'000'000 Treffer gerade mal je einer auf 17 und 83 (!)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Normalverteilte Zufallszahlen
BeitragVerfasst: Fr 04 Jul, 2008 22:32 
Offline
Freak
Freak

Registriert: So 30 Okt, 2005 17:48
Beiträge: 1408
Wohnort: PB
Geschlecht: Männlich
LoGD: http://dav.blood-reaver.de/lotgd/
Da war ich schon mal Schneller :-P

Nee, ein ordentlicher Algorythmus für ne schöne Glockenkurve ist schon was feines.

Wer sich das ganze mal ein bisschen genauer anschauen will.. ich hatte sowas auch noch mal in Delphi mit GUI geschrieben
Gauß'sche Glockenkurve Graphisch dargestellt mit veränderbaren Parametern als delphi-Code (vorkompiliert und als Source)

_________________
Mehr oder minder inaktiv


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Normalverteilte Zufallszahlen
BeitragVerfasst: Fr 04 Jul, 2008 22:58 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3898
Wohnort: Basel
Geschlecht: Männlich
Verdammt. Hab ich doch geahnt, dass damals bei der Aufklärung um e_rand() irgendwo Code dabei war. Hät' ich blos gesucht und mir die Arbeit erspart ;p
Ewigkeiten hab ich gebraucht, um von den Zahlen zwischen -1 und + 1 auf eine range zwischen $min und $max zu kommen... Grm! ^^

PS: Dein Delphi-Programm zeigt erst ab 4000 Loops einigermassen eine Glockenkurve - aber auch da hats Ausnahmen drunter. Unter über 4000 gibts zumindest bei mir (Wine 1.1.0) grafische Probleme ^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Normalverteilte Zufallszahlen
BeitragVerfasst: So 06 Jul, 2008 23:36 
Offline
Freak
Freak

Registriert: So 30 Okt, 2005 17:48
Beiträge: 1408
Wohnort: PB
Geschlecht: Männlich
LoGD: http://dav.blood-reaver.de/lotgd/
jupp, war halt nur ein einfach gestriktes Konstrukt - zudem ist der Random-Generator von Delphi echt grausam schlecht... aber er zeit halt, was dabei so rauskommen kann ^^

_________________
Mehr oder minder inaktiv


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen
Du darfst keine Antworten zu Themen in diesem Forum erstellen
Du darfst deine Beiträge in diesem Forum nicht ändern
Du darfst deine Beiträge in diesem Forum nicht löschen
Du darfst keine Dateianhänge in diesem Forum erstellen

Suche nach:
Gehe zu:  
cron
POWERED_BY
Deutsche Übersetzung durch phpBB.de
anpera.net - Impressum