[linux-l] [OT] Gewichtete Wahrscheinlichkeit, Random
Olaf Radicke
olaf_rad at gmx.de
So Feb 18 16:57:27 CET 2007
Am Sonntag, 18. Februar 2007 14:12 schrieb Oliver Bandel:
> On Sat, Feb 17, 2007 at 07:50:18PM +0100, Olaf Radicke wrote:
Ich beantworte die fragen, die auch in anderen Mails auftauchen - denke
ich - am besten, in dem ich mein Code kommentiere...
die Zielstellung Semigraphisch dargestellt:
X 100% des maximalen Niederschlag(MN). Warschinlichkeitsfaktor(WF):1
.X 95% MN. WF 2
...X 90% MN. WF 4
.......X 85% MN. WF 8
...............X 80% MN. WF 16
...............................X 75% MN. WF 32
...............................................................X
70% MN.WF 32 usw...
> > Wie auch immer. Der Algorithmus sieht jetzt so aus:
> >
> > int[] regengewichtung = new int[2097151];
Mit Hilfe eines Versuchs habe ich festgestellt, das wenn ich
Näherungswerte im 5% Abstand haben möchte, ich ein Array dieser Länge
brauche. Bei meinen ersten Versuch hatte ich ein int (Int32) verwendet.
Der war aber zu klein für den wert. Wenn ein Int32 "überfüllt" wird,
fängt er bei 0 wieder an. Also angenommen ich hätte ein int mit dem
maximalen wehrt 100 und ich versuche 101 zu speichern, "kippt er bei
100 um" und fängt wieder bei Null (0) an. Also haben wir nicht 101
gespeichert sondern 1. Das ist mir passiert, weil der Maximale Wert von
Int32 für C# in meinem Buch falsch angegeben war.
> > int faktor = 1;
Wie oft ein Wert (Niederschlagsmenge) in den Array vorkommen soll.
> > ulong gesamt = 0;
Der Countdown-Zähler, mit wir nicht über das Array-Ende
hinausschreiben, aber jedesmal ein anderen Speicherplatz benutzen.
> > for(int i = 100; i>=0; i=i-5)
> > {
i ist der Countdown-Zähler der Prozent-Werte der Niederschläge. Wir
beginnen mit 100% der maximalden Niderschlagsmenge. -5 weil wir in
5%-Schritten vorgehen.
> > for(int i2 = 0; i2<faktor; i2++)
> > {
Da die Niderschlagsmengen unterschiedlich oft im Array vorkommen sollen,
haben wir die Variable "Faktor", der bestimmt, wie oft die Schleife mit
einer bestimmten Niderschlagsmengen-Wert in das Array geschrieben wird.
Erster Durchgang z.B. ist für 100% Niederschläge, der ein mal in das
array geschrieben wird...
> > regengewichtung[gesamt] = i;
Der wert wird im Array gespeichert.
> > gesamt = gesamt+1;
Nächstes Array-Element....
> > }
> > faktor = faktor*2;
Nach Ende des Schleifendurchlauf, Faktor mal zwei erhöhen.
> > }
> > int niederschlag = regengewichtung[r.Next(0,2097151)];
So, hier fehlte eine Zeile Code, mit klar ist, was hier passiert:
Random r = new Random(); r ist also eine Instanz einer Random-Klasse.
> > Console.WriteLine("### niederschlag: " + niederschlag);
Ergebnis ist, das die Wahrscheinlichkeit das es nicht regnet 50% sind,
25% das es mit 5% der maximalen Menge regnet. 12,5% das es mit 10% der
maximalen Menge regnet. U.s.w.
Ich glaube es gibt die Möglichkeit, diese Problem mit geometrischen
Formen zu lösen.
http://de.wikipedia.org/wiki/Kurve_(Mathematik)
Ansonsten hab ich dann noch das gefunden...
http://de.wikipedia.org/wiki/Inversionsmethode
Für meine Zwecke reicht es.
> ImPrinzipspricht ja nix gegen das Array, aber wie flexibel
> handhabst Du eine Größenänderung?
Die ist zugegebener Maßen schlecht.
> Was passiert in C# eigentlich, wenn man über die Arraygrenzen hinaus
> zugreift?
Ich glaube der Zustand ist wie bei C und C++ undefiniert. Im besten
Fall, wirft die Runtime eine Laufzeit-Ausname. Im schlechtesten Fall,
kann alles passieren. Deswegen die Erwähnung von ArrayList und warum
ich sie trotzdem nicht nehme.
Gruß
Olaf
Mehr Informationen über die Mailingliste linux-l