[linux-l] [OT] Gewichtete Wahrscheinlichkeit, Random

Volker Grabsch vog at notjusthosting.com
So Feb 18 17:05:57 CET 2007


On Sat, Feb 17, 2007 at 06:43:04PM +0100, Olaf Radicke wrote:
> Am Samstag, 17. Februar 2007 17:46 schrieb Steffen Dettmer:
> [...]
> > Das schwierige ist vermutlich, sinnvolle Werte für die
> > Regenwahrscheinlichkeit und deren Änderung zu finden. 
> 1 X 100%
> 2 X 95%
> 4 X 90%
> 8 X 85%
[...]
> int prozent_regenstaerke = regen_array[ranom(0,401)];

Zu umständlich. Eine enorme Verschwendung von Speicherplatz. Wären
die Elemente des Arrays schwer zu berechnen, könnte man noch von
einer Optimierung reden, aber so ...

Wenn du schon weißt, wie das Array auszusehen hat, wieso berechnest
du deine "prozent_regenstaerke" nicht direkt?

    prozent_regenstaerke = R(random(0,101))

... wobei die Funktion R() genau das berechnet, was du sonst ins Array
geschrieben hättest. Dann kannst du diese Funktion stückweise vereinfachen.

----------------------------------------------------------------------

Zur ursprünglichen Frage: Da du kein vernünftiges Modell ansetzen kannst
und auch keine Wetterstatistik hast, ist die Einfachheit ganz besonders
wichtig. Schließlich hast du eh kein Modell, mit dem du das irgendwie
rechtfertigen könntest.

Mach dir um gewichtete Wahrscheinlichkeit und ähnliches keinen zu
großen Kopf. Dazu müsstest du zunächst mit den Begriffen
Zufallsvariable, Wahrscheinlichkeitsdichte und Verteilungsfunktion
perfekt umgehen können, und das Problem korrekt in dieser Sprache
formulieren. Kannst du gern tun, schaden wird es nicht, aber es wird
die Lösung deines Problems kein bisschen foran treiben. ;-)

Die Funktion wird eh nicht total realistisch sein, aber wenn sie
einfach ist, hast du sie wenigstens gut unter Kontrolle. Sie soll,
wenn ich dich richtig verstanden habe, etwa so aussehen:

   .
R /|\ 1           ***
   |            **   
   |           *   
   | 0,5       *  
   |           * 
   |         **   
   |  0   ***        
   |      0   0,5   1
    ---------------------> z

z = irgendein Zufallswert, R(z) = Regenstärke

Das heißt, besonders viel bzw. besonders wenig Regen sind am
wahrscheinlichsten (dort liegen viele Funktionswerte), und
"mittelmäßiger" Regen eher unwahrscheinlich (dort liegen wenig
Funktionswerte).


Die obige Funktion sieht aus wie eine Arcustangens-Funktion, man muss
sie nur ein wenig zurecht schieben und normieren. Mein Vorschlag:

    R(z) = 0.5 + 0.5 * atan(a*(z-0.5)) / atan(a*0.5)

wobei a ein Parameter ist, mit dem du die Steilheit steuern kannst.
Für a=1 sieht's fast wie eine diagonale Linie aus. Bei a=100 hast du
in der Mitte fast einen senkrechten Anstieg.

Für deine Zwecke dürfte etwa a=10 in Ordnung sein.


Willst du damit etwas herumspielen, nimm am besten gnuplot:

    $ gnuplot
    gnuplot>

Dort gibst du ein:

    plot [z=0:1] 0.5 + 0.5 * atan(a*(x-0.5)) / atan(a*0.5), a=10

wobei du den hinteren Wert "a=10" mal gegen "a=1" oder "a=100" ersetzen
kannst. Dann die Ausgabe beobachten.

Ist es etwa das, was du suchst? Sorry, was einfacheres als dieser
verzerrte Arcustangens ist mir nicht eingefallen.


Viele Grüße,

    Volker

-- 
Volker Grabsch
---<<(())>>---
Administrator
NotJustHosting GbR



Mehr Informationen über die Mailingliste linux-l