Поиск шаблона в строковой переменной - PullRequest
1 голос
/ 29 апреля 2010

Мне нужно создать проект головы или хвоста, в котором компьютер будет случайным образом угадывать до 5 раз, но в шестой раз он посмотрит в настройку переменной PlayersGuessHistory в виде строки, чтобы увидеть, может ли он найти соответствие для шаблона из 4-х человек. Если найден шаблон, компьютер будет угадывать следующий символ после шаблона.

Например, учитывая последовательность HHTTH, шаблон равен HHTT, поэтому компьютер будет угадывать H для шестого хода. Моя единственная проблема в том, что мне трудно настроить проект так, чтобы он просматривал историю игроков, находил шаблоны и угадывал следующего персонажа в истории. Есть предложения?

Ответы [ 3 ]

1 голос
/ 29 апреля 2010

Создайте List<string> и добавьте в него историю, чтобы каждый элемент в списке представлял собой строку из 4 символов (как показано в вашем тексте). Затем, когда компьютер должен угадать, выберите элементы (их должно быть несколько) из списка, который начинается с (myList.StartsWith - метода) вашей строки, тогда вы должны суммировать количество раз, которое H является следующим символом, и сумму раз T является следующим символом - вычислите вероятность каждого из них и позвольте компьютеру выбрать тот, который имеет наибольшую вероятность ...

Имеет ли это смысл?

0 голосов
/ 29 апреля 2010

Это небольшой фрагмент, основанный на том, что я понимаю по вашему требованию.Приведенный ниже метод вернет строку догадок «H» голов или «T» хвостов.Первые 5 догадок являются случайными, а затем, если любая последовательность из 4 догадок является HHTT, окончательная догадка будет 'H'.

     static string HeadsOrTails()
    {
        string guessHistory = String.Empty;
        // Guess heads or tails 5 times
        Random random = new Random();
        for (int currentGuess = 0; currentGuess < 5; currentGuess++)
        {
            if (random.Next(2) == 0)
                guessHistory += 'H';
            else
                guessHistory += 'T';
        }
        // Analyse pattern of guesses
        if (guessHistory.Substring(0, 4) == "HHTT" || guessHistory.Substring(1, 4) == "HHTT")
        {
            // If guess history contains HHTT then make the 6th guess = H
            guessHistory += 'H';
        }

        return guessHistory;
    }

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

0 голосов
/ 29 апреля 2010

Прежде всего, если головы и хвосты действительно случайны, как, например, в результате подбрасывания реальной монеты, эта задача не имеет смысла. Компьютер всегда будет правильно выполнять следующий бросок с вероятностью 1/2, независимо от каких-либо предполагаемых скороговорок в истории. (См. «Независимость» .)

Теперь, если головы и хвосты на самом деле не случайны (например, они созданы человеком, называющим головы или хвосты так, как он считает случайным), тогда мы можем заставить компьютер получить более высокую оценку успеха, чем 1 /2.

Я бы попробовал следующее: Для начала проверьте, как часто в истории.

  • головы сопровождаются головами
  • головы сопровождаются хвостами

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

Говорит в последовательности "ХХХТ", вы найдете - H-> H: 2 из 3 - H-> T: 1 из 3 - T-> H: 1 из 1 Так как последний бросок выпал на голову, компьютер должен выбрать головы в качестве предположения для следующего броска.

Теперь вы можете поэкспериментировать с учетом более длинных частей истории, посчитав переходы "HH-> T" и т. Д., И попытаться улучшить свой показатель успеха.

...