J'essaie d'écrire un programme pour sélectionner un nom aléatoire parmi US Census last name list. Le format de liste estSélectionnez un élément aléatoire dans une liste pondérée
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
En supposant que je charge les données dans une structure comme
Class Name
{
public string Name {get; set;}
public decimal Weight {get; set;}
public decimal Cumulative {get; set;}
}
Quelle est la structure des données serait préférable de tenir la liste des noms, et quelle serait la meilleure façon de choisir un nom aléatoire de la liste, mais la distribution des noms doit être la même que le monde réel.
Je ne travaillerai qu'avec les 10 000 premières lignes si cela fait une différence dans la structure de données.
J'ai essayé d'examiner d'autres questions concernant le caractère aléatoire pondéré, mais j'ai un peu de mal à faire passer la théorie au code. Je ne connais pas grand-chose à la théorie mathématique, donc je ne sais pas s'il s'agit d'une sélection aléatoire "Avec ou sans remplacement", je veux que le même nom puisse apparaître plus d'une fois, quelle que soit la signification.
Stocker dans cumulatives d'un arbre binaire équilibré avec les noms des nœuds. Sélectionnez un entier aléatoire inférieur à la somme des cumuls et recherchez-le (inférieur à) dans l'arbre bin. –
@belisarius Y a-t-il des structures arborescentes binaires intégrées à .NET ou devrais-je en écrire une? –
@Scott: Vous pouvez simplement utiliser un tableau pour celui-ci - BinarySearch fonctionnera bien tant qu'il est trié ... –