2010-04-15 9 views
8

Ich habe ein Array von Strukturen und eines der Felder in der Struktur ist ein Float. Ich möchte eine der Strukturen auswählen, bei denen die Wahrscheinlichkeit, sie auszuwählen, relativ zum Wert des Floats ist. dhC++ - Funktion zum Auswählen aus einer Liste, in der jedes Element eine bestimmte Wahrscheinlichkeit hat

struct s{ 
    float probability; 
    ... 
} 

s sArray[50]; 

Was ist der schnellste Weg zu entscheiden, welche zu wählen? Gibt es dafür eine Funktion? Wenn ich die Summe aller Wahrscheinlichkeitsfelder wüsste (beachte, dass es nicht 1 ist), könnte ich dann jedes s durchlaufen und probability/total_probability mit einer Zufallszahl vergleichen und die Zufallszahl für jedes s ändern? dh

if((float) (rand()/RAND_MAX) < probability)... 

Antwort

9
float p = (rand()/static_cast<float>(RAND_MAX)) * total_probability; 
s* current = &sArray[0]; 
while ((p -= current->probability) > 0) 
    ++current; 
// `current` now points to your chosen target 
+0

s-> Wahrscheinlichkeit sollte aktuell sein -> Wahrscheinlichkeit, richtig? – Stuart

+0

'rand()/static_cast (RAND_MAX)' wird immer entweder 0 (mit sehr hoher Wahrscheinlichkeit) oder 1 (mit sehr geringer Wahrscheinlichkeit) sein. Sie könnten stattdessen 'rand()/static_cast (RAND_MAX)' versuchen. –

+0

Ich verwendete: '(float) ((float) rand()/RAND_MAX)' Es funktioniert für mich. – Stuart

3

Finden Sie RAND_MAX wie Sie sagen. Generieren Sie eine Zufallszahl bis RAND_MAX. Iterieren Sie durch das Array, indem Sie die Wahrscheinlichkeiten hochzählen, bis die generierte Zufallszahl erreicht oder überschritten ist. (mit nur 50 Elemente Leistung sollte kein Problem sein, ansonsten kann die Summen der Wahrscheinlichkeiten einmal in einem anderen Array und macht dann eine Halbierungssuche in die für den Zufallswert.)

+0

Exakte Optimierung hängt davon ab, wie oft wird das Array geändert, verglichen damit, wie oft Sie ein zufälliges Element auswählen, und eine vorzeitige Optimierung ist sowieso ein schlechter Plan. Das heißt, Sie könnten RAND_MAX beim Erstellen und Ändern des Arrays auf dem neuesten Stand halten, sodass Sie es nicht jedes Mal neu berechnen müssen, wenn Sie ein zufälliges Element auswählen. Sie können auch kumulative Wahrscheinlichkeiten speichern, so dass Sie anstatt einzelne Wahrscheinlichkeiten zu durchlaufen und hinzuzufügen, einfach eine binäre Suche nach der kumulativen Wahrscheinlichkeit durchführen können. – Cascabel

+0

@Jefromi - Ich habe dieses Bit nur zur Antwort hinzugefügt! Du warst wirklich schnell mit diesem Kommentar !! –

+0

Wahrscheinlichkeiten ändern sich häufig. Zwei Objekte werden zufällig ausgewählt, und dann können sich ein oder zwei Objekte in dem Array ändern. Das passiert viele Male. – Stuart

Verwandte Themen