ANSI C: Comment découper une chaîne par nouvelle ligne et obtenir une ligne au hasard
Question
Je suis un nouveau à C et suis coincé avec STAB. Je peux diviser chaîne avec strtok
mais je ne sais pas comment obtenir un jeton aléatoire.
Merci.
La solution
Vous pouvez analyser deux fois, puis obtenir un nombre aléatoire et choisir un, ce qui vous collectez au deuxième passage de la même chaîne.
Ou, vous pouvez le faire en une seule passe si vous utilisez réservoir d'échantillonnage.
La maîtrise de l'échantillonnage du réservoir sera un moyen très utile d'apprendre C comme un côté à l'apprentissage des mathématiques! :)
Autres conseils
Le pseudocode suivant montre comment retourner un candidat uniformément sélectionné parmi les jetons de la chaîne:
string result = null; int tokens = 0; while (true) { string candidate = next token; if (candidate does not exist) break; tokens = tokens + 1; if ((a random integer selected between 0 and tokens-1) == 0) result = token; } return result;
Ceci est un cas particulier de algorithme R de la section 3.4.2 du Volume II de L'art de la programmation informatique de Knuth .