2010-04-15 14 views
8

Tengo una matriz de estructuras y uno de los campos de la estructura es un flotador. Quiero elegir una de las estructuras donde la probabilidad de elegirla es relativa al valor de la flotación. es decir,C++ función para elegir de una lista donde cada elemento tiene una probabilidad distinta

struct s{ 
    float probability; 
    ... 
} 

s sArray[50]; 

¿Cuál es la forma más rápida de decidir qué s elegir? ¿Hay una función para esto? Si supiera la suma de todos los campos de probabilidad (tenga en cuenta que no será 1), ¿podría iterar a través de cada s y comparar probability/total_probability con un número aleatorio, cambiando el número aleatorio para cada s? es decir,

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

Respuesta

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-> la probabilidad debería ser actual-> probabilidad, ¿correcto? – Stuart

+0

'rand()/static_cast (RAND_MAX)' siempre será 0 (con muy alta probabilidad) o 1 (con muy baja probabilidad). Puede intentar 'rand()/static_cast (RAND_MAX)' en su lugar. –

+0

Utilicé: '(flotación) ((flotación) rand()/RAND_MAX)' Funciona para mí. – Stuart

3

Descubre RAND_MAX como dices. Genera un número aleatorio hasta RAND_MAX. Itere a través de la matriz contando las probabilidades hasta que iguale o exceda su número aleatorio generado. (con sólo 50 Rendimiento de elemento no debería ser un problema, de lo contrario almacenar las sumas de las probabilidades de una vez en otra matriz y luego hacer una búsqueda de bisección en que por el valor aleatorio.)

+0

optimización exacta depende de cómo a menudo la matriz se modifica en comparación con la frecuencia con la que eliges un elemento aleatorio, y la optimización prematura es un mal plan de todos modos. Dicho esto, puede mantener RAND_MAX actualizado mientras construye y modifica la matriz para que no tenga que volver a calcularla cada vez que elija un elemento aleatorio. También puede almacenar probabilidades acumuladas de modo que en lugar de iterar y agregar probabilidades individuales, simplemente puede hacer una búsqueda binaria en la probabilidad acumulada. – Cascabel

+0

@Jefromi - ¡Acabo de añadir ese poco a la respuesta! ¡Estuviste realmente RÁPIDO con ese comentario! –

+0

Las probabilidades cambiarán a menudo. Dos objetos se escogen al azar y luego uno o dos objetos en la matriz pueden cambiar. Esto sucede muchas veces – Stuart

Cuestiones relacionadas