PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie Daten speichern?


Xanatos
2008-04-02, 23:13:42
Moinsen,
stehe grade vor einem Problem. Es geht darum, dass ich nicht weiß wie ich gewisse Daten speichern soll. Es geht dabei um Größenangaben eines Menschens, z.B. 192cm.
Das Programm wählt nur aus einer Reihe von solchen Angaben eine aus. Ich dachte zuerst an ein Array, allerdings stellt sich da ein kleines Problem. Manche Angaben sollen eine höhere Wahrscheinlichkeit haben, gewählt zu werden als andere.
Ich könnte natürlich diese Angeben mehrfach in ein Array schreiben, aber ich wollte erst mal fragen, ob es noch eine andere Möglichkeit gibt?

Wahrscheinlich wird Java verwendet.

Monger
2008-04-02, 23:26:10
Das Auswürfeln und die Datenhaltung sind erstmal zwei getrennte Probleme.

Fassen wir doch mal zusammen was du gesagt hast:

1) Du hast einen Satz an Daten
2) Jeder Satz hat eine Wahrscheinlichkeit
3) jeder Satz hat einen Wert für Körpergröße

Nun, genau so würde ich es auch modellieren. Anbieten würde sich hier z.B. eine HashMap, mit der Körpergröße als Schlüssel und der Häufigkeit als Wert.

Wenn du dann daraus deine Zufallsfunktion bastelst, macht es vielleicht wirklich Sinn, in ein Array deine Körpergrößen so oft hineinzuschichten wie deine Häufigkeit sagt. Dann ist das ziehen von einzelnen Werten danach sehr schön unkompliziert. Aber im allgemeinen sollte man natürlich so viel Redundanz vermeiden.

AtTheDriveIn
2008-04-02, 23:34:16
Hmm... also ich würde die Körpergrößen es als simples Array speichern. Die Wahrscheinlichkeit würde ich über Bereiche in einem Zufallszahlenraum gewährleisten.

Also Beispiel: Größen g={1.92,1.80,1.68}
Zufallszahlen zwischen 1 und 100 wobei der Bereich 1-50 auf a[0] verweist, 51-80 auf a[1] und 80-100 auf a[2].
Durch Anpassung der Räume kann die Wahrscheinlichkeit angepasst werden.

Das ist das erste was mir nach 3 Weizen eingefallen ist. :)

Gnafoo
2008-04-03, 01:51:39
Einfach ein Array mit Structs die jeweils Daten und Wahrscheinlichkeit enthalten. Dazu eine Variable, welche die Summe der Wahrscheinlichkeiten speichert und diese Up-to-date halten.

Wenn du etwas auswählen musst, würfelst du eine Zufallszahl zwischen 0 und dem Maximalwert und gehst dann linear die Array-Einträge durch, wobei du immer die Wahrscheinlichkeit des aktuellen Eintrages vom gewürfelten Wert subtrahierst. Ist das Ergebnis <= 0, dann wählst du den Eintrag aus. Ansonsten gehts mit dem nächsten weiter. Läuft in O(n).

Du kannst den Maximalwert natürlich auch bei jeder Auswahl neu berechnen. Ist etwas mehr Overhead, ist aber bei einem kleinen Array unter Umständen auch kein Problem. Dafür muss man sich nicht gesondert drum kümmern und vermeidet potentielle vergessene Updates.

Wenn es schneller gehen soll (wobei ich vermute, dass das in deinem Fall Overkill ist), kann man auch die Wahrscheinlichkeiten in den Einträgen aufaddieren und dann die Einträge mit binärer Suche rausholen (O(log n)). Dann hat man aber etwas mehr Aufwand beim Verändern der Liste.

Ist im Prinzip auch nicht viel anders, als der Vorschlag von AtTheDriveIn. Bloß etwas allgemeiner gefasst.

Siehe auch: http://en.wikipedia.org/wiki/Fitness_proportionate_selection (wobei das Bild es klar machen sollte, der Rest vom Wikipedia-Artikel ist etwas OT X-D).