Laden...

Einträge aus einer Liste nach vorgegebener Wahrscheinlichkeitsverteilung zufällig auswählen?

Erstellt von PoWl vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.445 Views
P
PoWl Themenstarter:in
219 Beiträge seit 2008
vor 7 Jahren
Einträge aus einer Liste nach vorgegebener Wahrscheinlichkeitsverteilung zufällig auswählen?

Ich würde gerne eine Bildergallerie programmieren. Die anzuzeigenden Bilder sind in einer Liste gespeichert, ebenso ihr Aufnahmedatum.

Ich möchte nun alle paar Sekunden ein zufälliges Bild aus dieser Liste auswählen. Die Wahrscheinlichkeit soll jedoch um so höher sein, je neuer das Bild ist, bzw. um so geringer, je älter das Bild ist. Damit erreiche ich, dass vorwiegend die neueren Bilder angezeigt werden aber hin und wieder auch ältere mit dabei sind, so als Erinnerung quasi.

Die Wahrscheinlichkeitsverteilung für die Liste ist durch eine Funktion, welche ich mir schreiben werde, vorgegeben.

Wie programmiere ich die Zufallsauswahl mit dieser Wahrscheinlichkeitsverteilung?

Ich könnte mir vorstellen, dass ich jedem Listeneintrag je nach Wahrscheinlichkeit einen Zahlenbereich zuordne, der um so größer ist, je höher die nominelle Wahrscheinlichkeit des Listeneintrags ist. Dann erstelle ich eine gleichverteilte Zufallszahl, welche mir eine Zufallszahl von 0 bis {summe aller zahlenbereiche} liefert. Dann durchlaufe ich die Liste und schaue, in wessen Listeneintrags Zahlenbereich die Zufallszahl liegt.

z.B.
Bild1 p=50% z=[0...4]
Bild2 p=30% z=[5...7]
Bild3 p=20% z=[8...9]
Bild4 p=10% z=[10]

wenn ich nun eine Zufallszahl s aus dem bereich [0...10] erzeuge, z.B. s=6, dann durchlaufe ich die Liste, bis die Zufallszahl im entsprechenden Zahlenbereich liegt. In diesem Fall bei Bild2.

Besonders geschickt erscheint mir dieser Algorithmus allerdings noch nicht und ich muss mir überlegen, wie ich bei krummen Wahrscheinlichkeitswerten wie p=3,435% usw. den zugeordneten Wertebereich zusammenstelle.

Gibt es noch eine bessere Methode?

lg

C
2.122 Beiträge seit 2010
vor 7 Jahren

Besonders geschickt erscheint mir dieser Algorithmus allerdings noch nicht

Warum nicht? So würd ichs auch machen, allerdings würde ich die Zahlen richtig anpassen 😃
50+30+20+10 = ??

Krumme Werte sind kein Problem. Rechne das so

Bild1 p=50% z= < 5
Bild2 p=30% z= < 8 (und ≥ 5)
Bild3 p=20% z= < 10 (und ≥ 8)

Das kannst du so testen
z = Zufallszahl im Bereich [0..9[ erzeugen, getNext(10)
if (z < 5) -> Bild1
else if (z < 8) -> Bild 2
else -> Bild 3

5.658 Beiträge seit 2006
vor 7 Jahren

Hier gibt es noch ein paar andere Algorithmen / Anregungen: How to pick an item by its probability?

Weeks of programming can save you hours of planning