ANSI C: Come dividere una stringa a capo e ottenere una riga a caso
Domanda
Sono un nuovo alla C, ma ho bloccato con subj. Posso dividere stringa con strtok
, ma non so come ottenere un token casuale.
Grazie.
Soluzione
È possibile analizzare due volte, quindi ottenere un numero casuale e sceglierne uno, che si raccolgono durante il secondo passaggio della stessa stringa.
In alternativa, si può fare in un unico passaggio, se si utilizza serbatoio di campionamento .
Mastering campionamento serbatoio sarà un modo molto utile per imparare C come un lato per l'apprendimento della matematica! :)
Altri suggerimenti
Il seguente pseudocodice illustrato come restituire un candidato uniformemente selezionato tra i segni della stringa:
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;
Questo è un caso particolare di Algoritmo R dalla sezione 3.4.2 del volume II di Knuth The Art of Computer Programming .