C: Получить случайную строку, начинающуюся с определенного символа из файла - PullRequest
0 голосов
/ 02 июня 2018

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

Текстовый файл организован так:

@username
§
tweet1
§
tweet2
§
@username2

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

Единственные способы, которыми я могу придумать рандомизациюпользователь:

  • Просматривает весь текстовый файл, каждый раз, когда он видит имя пользователя, он сохраняет строку и увеличивает счетчик.Затем я выбираю случайным образом селектор и получаю имя пользователя.
  • Избегайте необходимости просматривать весь текстовый файл.И просто выделите каждого пользователя в отдельный текстовый файл.Просто получите имена файлов в определенной папке и рандомизируйте оттуда (если это возможно).

Но тогда возникает та же проблема, как рандомизировать твит, я знаю, когда он начинается и заканчиваетсяНо, чтобы выбрать случайный, единственный способ, о котором я могу думать, - это первый, упомянутый выше.

Ребята, вы предлагаете какой-нибудь более умный способ?

Спасибо за тонну!

1 Ответ

0 голосов
/ 02 июня 2018

Вот комментарий от недавно написанного мной кода, который содержит полезную информацию для вас:

/*
** From Wikipedia on Reservoir Sampling
** https://en.wikipedia.org/wiki/Reservoir_sampling
**
** Algorithm R
** The most common example was labelled Algorithm R by Jeffrey Vitter in
** his paper on the subject.  This simple O(n) algorithm as described in
** the Dictionary of Algorithms and Data Structures consists of the
** following steps (assuming k < n and using one-based array indexing):
**
**    // S has items to sample, R will contain the result
**    ReservoirSample(S[1..n], R[1..k])
**        // fill the reservoir array
**        for i = 1 to k
**            R[i] := S[i]
**
**        // replace elements with gradually decreasing probability
**        for i = k+1 to n
**            j := random(1, i)   // important: inclusive range
**            if j <= k
**                R[j] := S[i]
**
** Alternatively: https://stackoverflow.com/questions/232237
** What's the best way to return one random line in a text file
**
**      count = 0;
**      while (fgets(line, length, stream) != NULL)
**      {
**          count++;
**          // if ((rand() * count) / RAND_MAX == 0)
**          if ((rand() / (float)RAND_MAX) <= (1.0 / count))
**              strcpy(keptline, line);
**      }
**
** From Perl perlfaq5:
** Here's a reservoir-sampling algorithm from the Camel Book:
**
**      srand;
**      rand($.) < 1 && ($line = $_) while <>;
**
** This has a significant advantage in space over reading the whole file
** in.  You can find a proof of this method in The Art of Computer
** Programming, Volume 2, Section 3.4.2, by Donald E. Knuth.
*/

Вам нужно будет сделатьнекоторые решения о том, что является случайным выбором в вашем случае.

Если в вашем файле 12 твитеров, с (для обсуждения) от 1 до 12 твитов каждый, то хотите ли вы выбрать каждый твитер сс вероятностью 1/12, а затем каждый твитер выбирает один из своих твитов случайным образом (из набора, принадлежащего этому твитеру), или у вас есть какая-то другая схема в виду - например, если есть 66 твитов, есть1/66 вероятность того, что будет выбран тот или иной твит, но тот, кто твитнул больше всего, будет более вероятным, чем тот, кто только один раз твитнул.

Как только вы решили, каким правилам вы хотите следовать, тКодирование, основанное на приведенной выше информации, довольно просто.

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