Algo como esto:
int count = 0;
int index = -1;
for (int i = 0; i != n; ++i)
{
if (values[i])
{
++count;
if (unit_random <= 1.0f/count)
{
index = i;
}
}
}
Así, por 4 valores, por ejemplo, se obtienen los siguientes probabilidades para sus índices:
1: (1/1) * (1/2) * (2/3) * (3/4) = 1/4
2: (1/2) * (2/3) * (3/4) = 1/4
3: (1/3) * (3/4) = 1/4
4: 1/4 = 1/4
EDIT: Como Steve Jessop señaló el punto de comparación flotante eventualmente conducirá a una selección muy poco uniforme. Suponiendo unit_random
se define como rand()/RAND_MAX
la comparación se puede cambiar a:
typedef unsigned long long u64;
u64 product = u64(count) * rand();
if (product <= u64(RAND_MAX))
Esto no dará perfecta distribución debido a la naturaleza discreta de rand
pero será mejor.
Lo siento, se olvidó una palabra. Quise decir: devuelve el índice de un valor TRUE aleatorio ... No solo el primero que encontramos. Pero la función debe devolver aleatoriamente cualquiera de los índices que contiene un VERDADERO. – PaulV
@PaulV Eso es exactamente lo que hace esta función. –
@Nick Sí, pero he editado mi respuesta;) –