Qualcosa di simile a questo:
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;
}
}
}
Così per 4 valori per esempio, si ottengono i seguenti probabilità per i loro indici:
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: Come Steve Jessop ha sottolineato il punto di confronto floating alla fine porterà a una selezione molto non uniforme. Supponendo unit_random
è definito come rand()/RAND_MAX
il confronto può essere cambiato in:
typedef unsigned long long u64;
u64 product = u64(count) * rand();
if (product <= u64(RAND_MAX))
Questo non darà perfetta distribuzione a causa della natura discreta rand
ma sarà meglio.
fonte
2012-03-23 13:42:24
Scusa, ho dimenticato una parola. Volevo dire: restituire l'indice di un valore VERO casuale ... Non solo il primo che troviamo. Ma la funzione dovrebbe restituire a caso uno qualsiasi degli indici contenenti un VERO. – PaulV
@PaulV Questo è esattamente ciò che fa questa funzione. –
@Nick Sì, ma ho modificato la mia risposta;) –