试图证明一个兄弟错误,即即使使用正确数量的字符,使用Brute Force计算机花多长时间才能猜测特定的字符串。我可以运行代码,但无法弄清楚使其在每次运行时打印一个新字符串。我确定我已经结束了简单的事情。以下是我尝试过的代码的几个示例。
import string
import random
random=''.join([random.choice(string.ascii_letters+string.digits) for n in xrange(5)])
while True:
if random != "Steve":
print(random)
if random == "Steve":
print("Found")
这将不断重复打印相同的字符串。我也尝试过在没有while
的情况下仅使用if
语句,但这似乎不起作用。
我很了解,一旦random
选择了这5个随机字符,它就不会改变,除非有什么改变为止,但是就像我说的那样,我不确定该怎么做。我曾尝试将random
移到其他地方,但没有用,只是得到了不同的错误消息。
有人可以帮我吗。
答案 0 :(得分:4)
random=''.join([random.choice(string.ascii_letters+string.digits) for n in xrange(5)])
这不会每次都创建一个新的随机字符串。在这一点上,random只是一个随机生成的字符串,在while循环运行时不会改变。引用random不会创建新的字符串,而是只会获取您生成的第一个字符串,因为random只是内存中的字符串而不是函数。
将随机字符串创建移动到函数中
import string
from random import choice
def make_random():
return ''.join([choice(string.ascii_letters+string.digits) for n in xrange(5)])
然后运行循环:
while True:
random = make_random()
if random != "Steve":
print(random)
if random == "Steve":
print("Found")
编辑:
将import random
切换为from random import choice
是因为random(变量)覆盖了random(库),并在您尝试调用random.choice
时引发属性错误。
答案 1 :(得分:2)
您在这里有两个问题。正如@Primusa指出的那样,您的随机数应该在循环内移动,否则只会运行一次。但是,另一个问题是,您正在导入random
,并且还将变量设置为random
。这就是您的NameError
的来源。您已将random
定义为字符串,该字符串可在循环的第一次迭代中使用。但是,在第二次迭代中,random
不会为此声明一个名为choice
的函数,因为此时它是一个字符串。重命名random
变量或在别名下导入random
包,如下所示:
import random as rnd