ANSI C: Como dividir uma corda por newline e obter uma linha aleatória
Pergunta
Eu sou um novo no C e fiquei preso com o SUBJ. Eu posso dividir a corda com strtok
Mas não sei como obter um token aleatório.
Obrigado.
Solução
Você pode analisá -lo duas vezes, depois obter um número aleatório e escolher um, que você coleta na segunda passagem da mesma string.
Ou, você pode fazer isso em um único passe se usar Amostragem de reservatório.
A amostragem de reservatório de domínio será uma maneira muito útil de aprender C como um lado para aprender algumas matemáticas! :)
Outras dicas
O pseudocódigo a seguir mostra como devolver um candidato uniformemente selecionado entre os tokens da string:
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;
Este é um caso especial de Algoritmo r da seção 3.4.2 do volume II do Knuth's A arte da programação de computadores.