在字符串变量中查找模式

时间:2010-04-29 06:54:58

标签: c# string pattern-matching

我需要创建一个头或尾项目,其中计算机将随机猜测最多5次,但在第六次它会将playersGuessHistory变量设置作为字符串查看它是否可以找到模式的匹配4个entires。如果找到模式,计算机将猜测模式后面的下一个字符。

例如,给定序列HHTTH,模式为HHTT,因此计算机会在第六个回合猜测H。我唯一的问题是我在设置项目时遇到了困难,因此它会查看玩家的历史,找到模式并猜测历史中的下一个角色。有什么建议吗?

3 个答案:

答案 0 :(得分:1)

创建一个List<string>并将历史记录添加到此中,以便列表中的每个项目都是一个包含4个字符的字符串(就像您在文本中显示的那样)。然后,当计算机应该猜测从列表开始选择(应该有几个)项目(myList.StartsWith - 方法)你的字符串,那么你应该总结H是下一个字符的次数,并且T是下一个字符的次数 - 计算每个字符的概率,让计算机选择概率最高的那个......

有意义吗?

答案 1 :(得分:0)

首先,如果头部和尾部真的是随机的,就像翻转实际硬币一样,这项任务毫无意义。无论历史上有任何感知模式,计算机总是以1/2的概率获得下一次投掷权。 (见"Independence"。)

现在,如果头部和尾部不是真正随机的(例如,它们是由一个他认为是随机的方式调用头部或尾部的人创建的),那么我们可以让计算机获得更高的成功报价而不是1 / 2。

我会尝试以下操作:首先,检查历史记录中的频率。

  • 头部跟着头
  • 头部跟着尾巴

并使用这些数字来猜测转移概率H-> H和H-> T,对尾部做同样的事情,并根据最后一个猜测下一个结果,选择看起来更可能的任何一个。

你会发现,顺序是“HHHTH”   - H-> H:2的3   - H-> T:1的3   - T-> H:1的1 自从最后一次投掷结束后,计算机应该选择头部作为下一次投掷的猜测。

现在,您可以尝试将历史记录的较长部分考虑在内,通过计算转换“HH-&gt; T”等等,并尝试提高您的成功率。

答案 2 :(得分:0)

根据我对您的要求的理解,这是一个小片段。下面的方法将返回一串“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个随机初始猜测,但根据需要应该很容易增强。