猴子定理 - 选择随机字母,直到生成输入字符串

时间:2016-09-10 22:56:54

标签: python

我想让代码类似于无限猴子定理 该定理指出:

  

一只猴子在打字机键盘上随机敲击键无限   时间量几乎肯定会键入给定的文本,如   莎士比亚的全集。

好吧,假设我们用蟒蛇取代一只猴子来生成一个莎士比亚的句子?并计算试验

例如:“将它视为狡猾的人”

这是我写的:

def Monkey_Theorem(sentence):
    sentence.lower()
    string_letters = 'abcdefghijklmnopqrstuvwxyz'
    import random
    a = []
    l = ''
    x = 0
    trials = 0
    while x < (len(sentence) - 1):
        trials += 1
        z = random.choice(string_letters)
        if z == sentence[x]:
            a.append(z)
            x += 1
        elif z == " ":
            trials -= 1
            a.append(" ")
        if x > (len(sentence) - 1):
            l = ''.join(l)
            break
    return l and trials

我把它写入python 2.7 IDLE,按回车然后写道:

Monkey_Theorem("methinks it is like a weasel")

之后我按下了输入..它移动到下一行并没有提出(&gt;&gt;&gt;)

过了一段时间没有结果,当我试图用绝望的方式关闭IDLE时,它表示程序仍在运行

这里的问题:

(A)是while循环无限的一个?
(B)或我的IDLE很慢?
(C)其他原因
以及如何解决原因

还有一个请求 如果我将来遇到这种情况,如何(A),(B),(C)?如何检测案件?

2 个答案:

答案 0 :(得分:1)

在您的代码中,您设置了string_letters = 'abcdefghijklmnopqrstuvwxyz'。请注意string_letters中没有空格,因此当您匹配整个第一个单词'methinks'时,就无法匹配该单词之后的空格。所以你的循环会无限延续。

您可以通过在string_letters的定义字符串末尾添加空格来解决该特定问题。但正如其他人指出的那样,你的代码也存在其他问题。

至于检测它是什么,包括通过按键或按ctrl + C或类似的东西来停止循环的方法。然后打印trials的值,看看它是否是非常大号。如果是这样,您将拥有无限或极长的循环。

答案 1 :(得分:1)

你可以在循环中打印一些内容以查看它是否是无限的...例如,如果z永远不等于sentence[x],那么你就不会增加它,并且循环从不停止。

当您需要猜测空格字符时会发生这种情况,因为您没有将其放入字符串中。因此,永远不会输入elif z == " ":

以下是您的代码的工作版本。

需要注意的一些事项:跟踪al毫无意义。在函数结束时,您将返回与sentence完全相同的输入。此外,还有一个简单的导入来获取所有的英文字母。

from string import ascii_lowercase as alpha
import random

# add space character to possible choices
alpha += ' '

def Monkey_Theorem(sentence):
    sentence = sentence.lower()
    x = 0
    trials = 0
    while x < len(sentence):
        trials += 1
        z = random.choice(alpha)
        if z == sentence[x]:
            if z == " ": # this isn't really necessary
                trials -= 1
            print "guessed %s at trial %d" % (z, trials)
            x += 1
    return trials

trials = Monkey_Theorem("hello world")
print "number of trials = ", trials

输出

guessed h at trial 49
guessed e at trial 52
guessed l at trial 58
guessed l at trial 107
guessed o at trial 145
guessed   at trial 157
guessed w at trial 168
guessed o at trial 197
guessed r at trial 232
guessed l at trial 248
guessed d at trial 269
number of trials =  269