2010-04-15 5 views
8

Ho una matrice di strutture e uno dei campi nella struct è un float. Voglio scegliere una delle strutture in cui la probabilità di selezionarlo è relativa al valore del float. ieFunzione C++ per il prelievo da una lista in cui ogni elemento ha una probabilità distinta

struct s{ 
    float probability; 
    ... 
} 

s sArray[50]; 

Qual è il modo più veloce per decidere quale scegliere? C'è una funzione per questo? Se conoscessi la somma di tutti i campi di probabilità (Nota che non sarà 1), allora potrei scorrere ogni s e confrontare probability/total_probability con un numero casuale, cambiando il numero casuale per ogni s? ie

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

risposta

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-> probabilità dovrebbe essere corrente-> probabilità, corretta? – Stuart

+0

'rand()/statico_cast (RAND_MAX)' sarà sempre o 0 (con probabilità molto alta) o 1 (con probabilità molto bassa). Potresti provare 'rand()/static_cast (RAND_MAX)'. –

+0

Ho usato: '(float) ((float) rand()/RAND_MAX)' Funziona per me. – Stuart

3

Trova RAND_MAX come dici tu. Genera un numero casuale fino a RAND_MAX. Iterate attraverso l'array contando le probabilità finché non siete uguali o superiori al numero casuale generato. (con solo 50 prestazioni elemento non dovrebbe essere un problema, altrimenti memorizzare le somme delle probabilità una volta in un altro array e poi fare una ricerca di bisezione in quella per il valore casuale.)

+0

ottimizzazione esatta dipende da come spesso la matrice viene modificata rispetto alla frequenza con cui si seleziona un elemento casuale, e l'ottimizzazione prematura è comunque un piano errato. Detto questo, è possibile mantenere RAND_MAX aggiornato durante la costruzione e la modifica dell'array in modo da non doverlo ricalcolare ogni volta che si seleziona un elemento casuale. È anche possibile memorizzare le probabilità cumulative in modo che invece di scorrere e aggiungere probabilità individuali, si possa semplicemente effettuare una ricerca binaria sulla probabilità cumulativa. – Cascabel

+0

@Jefromi - Ho appena aggiunto quel bit alla risposta! Eri veramente veloce con quel commento !! –

+0

Le probabilità cambieranno spesso. Due oggetti vengono selezionati casualmente e quindi uno o due oggetti nell'array potrebbero cambiare. Questo succede molte volte. – Stuart