anpera.net
http://anpera.homeip.net/phpbb3/

Normalverteilte Zufallszahlen
http://anpera.homeip.net/phpbb3/viewtopic.php?f=43&t=4599
Seite 1 von 1

Autor:  Eliwood [ Fr 04 Jul, 2008 17:50 ]
Betreff des Beitrags:  Normalverteilte Zufallszahlen

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.

$this->bbcode_second_pass_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():

$this->bbcode_second_pass_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 (!)

Autor:  Auric [ Fr 04 Jul, 2008 22:32 ]
Betreff des Beitrags:  Re: Normalverteilte Zufallszahlen

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)

Autor:  Eliwood [ Fr 04 Jul, 2008 22:58 ]
Betreff des Beitrags:  Re: Normalverteilte Zufallszahlen

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 ^^

Autor:  Auric [ So 06 Jul, 2008 23:36 ]
Betreff des Beitrags:  Re: Normalverteilte Zufallszahlen

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 ^^

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/