ANSI C: Comment découper une chaîne par nouvelle ligne et obtenir une ligne au hasard

StackOverflow https://stackoverflow.com/questions/2217641

  •  19-09-2019
  •  | 
  •  

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.

Était-ce utile?

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 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top