2013-02-02 12 views
5

Desidero utilizzare la risposta fornita nel numero this per scegliere in modo casuale elementi unici da un elenco.Come effettuare una scelta in base a una probabilità percentuale

Seguendo il metodo descritto, in ogni iterazione del mio ciclo, viene generato un valore di probabilità che rappresenta la possibilità percentuale dell'elemento corrente selezionato dall'elenco.

Quello che devo sapere è come utilizzare questo valore percentuale per selezionare l'elemento (o meno).

Ecco il codice che ho, con remainingIndices essere un List<int>

for (var i = 0; i < remainingIndices.Count; i++) 
{ 
    var probability = pixelsToAdd/(float)(remainingIndices.Count - i); 
} 

pixelsToAdd è 120 e remainingIndices.Count è 3600. I valori di probabilità che sto ottenendo inizio a 0,0333333351

La soluzione deve essere flessibile lavorare con una gamma di valori molto più ampia, preferibilmente con qualsiasi valore.

Grazie

commento

Per i futuri lettori di questo argomento vorrei chiarire che in un primo momento ho pensato che il valore di probabilità era una certa percentuale tra 0 e 100, ma in realtà si tratta di un valore compreso tra 0 e 1 e quindi corrisponde perfettamente con il valore di ritorno di Random.NextDouble() che quindi può essere utilizzato per il confronto come descritto nelle risposte di seguito.

risposta

3

Per utilizzare la probabilità, confrontarlo con un campione da variabile casuale che segue una distribuzione uniforme su [0, 1].

if (Random.NextDouble() <= probability) 
    // Take the ith element in the list 

È ciclo risultante sarà:

List<???> selectedItems = new List<???>(); 
for (var i = 0; i < remainingIndices.Count; i++) 
{ 
    var probability = pixelsToAdd/(float)(remainingIndices.Count - i); 
    if (Random.NextDouble() <= probability) 
    { 
     selectedItems.Add(items[i]); 
     pixelsToAdd--; 
    } 
} 
+0

Come è tipico ho scoperto Random.NextDouble() subito dopo la presentazione della domanda e improvvisamente cliccato nella mia testa. Grazie per il solido esempio, sono sicuro che mi sarei perso qualcosa senza di esso. – Steve