ANSI C: как разбить строку по новой строке и получить случайную строку - PullRequest
1 голос
/ 07 февраля 2010

Я новичок в C и застрял с Subj. Я могу разбить строку на strtok, но я не знаю, как получить случайный токен.

Спасибо.

Ответы [ 2 ]

5 голосов
/ 07 февраля 2010

Вы можете разобрать его дважды, затем получить случайное число и выбрать одно, которое вы соберете на втором проходе той же строки.

Или вы можете сделать это за один проход, если используете отбор проб из резервуара .

Овладение отбором проб из резервуара будет очень полезным способом изучения C как стороны изучения математики! :)

2 голосов
/ 07 февраля 2010

Следующий псевдокод показывает, как вернуть кандидата, равномерно выбранного среди токенов строки:

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;

Это особый случай Алгоритм R из раздела 3.4.2Том II Кнута Искусство компьютерного программирования .

...