Estoy intentando escribir un programa para seleccionar un nombre aleatorio del US Census last name list. El formato de lista esSeleccione un elemento aleatorio de una lista ponderada
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
Suponiendo me carga los datos en una estructura como
Class Name
{
public string Name {get; set;}
public decimal Weight {get; set;}
public decimal Cumulative {get; set;}
}
Qué estructura de datos sería lo mejor para mantener la lista de nombres, y cuál sería la mejor manera de seleccionar un nombre aleatorio de la lista pero la distribución de nombres sea la misma que en el mundo real.
Solo trabajaré con las primeras 10.000 filas si hace una diferencia en la estructura de datos.
He intentado ver algunas de las otras preguntas sobre aleatoriedad ponderada, pero estoy teniendo problemas para convertir la teoría en código. No sé mucho acerca de la teoría de las matemáticas, así que no sé si se trata de una selección aleatoria "con o sin reemplazo", quiero que el mismo nombre se muestre más de una vez, lo que sea que eso signifique.
cumulatives la tienda en un árbol binario balanceado con los nombres de los nodos. Seleccione un Entero aleatorio menor que la suma de los cumulativos y búsquelo (menor que) en el árbol de la bandeja. –
@belisarius ¿Hay estructuras de árbol binarias integradas en .NET o tendré que escribir una? –
@Scott: Puedes usar una matriz para este - BinarySearch funcionará bien siempre que esté ordenado ... –