Sto provando a scrivere un programma per selezionare un nome casuale dallo US Census last name list. Il formato lista èSelezionare un elemento casuale da un elenco ponderato
Name Weight Cumulative line
----- ----- ----- -
SMITH 1.006 1.006 1
JOHNSON 0.810 1.816 2
WILLIAMS 0.699 2.515 3
JONES 0.621 3.136 4
BROWN 0.621 3.757 5
DAVIS 0.480 4.237 6
supponendo che caricare i dati per una struttura come
Class Name
{
public string Name {get; set;}
public decimal Weight {get; set;}
public decimal Cumulative {get; set;}
}
Quale struttura di dati sarebbe meglio per tenere l'elenco dei nomi, e quale sarebbe il modo migliore per selezionare un nome casuale dalla lista ma la distribuzione dei nomi è la stessa del mondo reale.
Lavorerò solo con le prime 10.000 righe se fa la differenza nella struttura dei dati.
Ho provato a guardare alcune delle altre domande sulla casualità ponderata, ma ho un po 'di problemi nel trasformare la teoria in codice. Non so molto sulla teoria matematica, quindi non so se si tratta di una selezione casuale "Con o senza sostituzione", voglio che lo stesso nome sia in grado di mostrarsi più di una volta, il che significa sempre quello.
cumulabili Conservare in un albero binario bilanciato con i nomi nei nodi. Selezionare un numero intero casuale inferiore alla somma di cumulimici e cercarlo (meno di) nell'albero dei bin. –
@belisarius Ci sono delle strutture ad albero binario integrate in .NET o dovrò scriverne una? –
@Scott: puoi usare solo un array per questo - BinarySearch funzionerà bene finché è ordinato ... –