【问题标题】:New string every time a loop runs每次循环运行时的新字符串
【发布时间】:2025-11-27 09:30:01
【问题描述】:

希望通过使用蛮力来证明计算机可以花费多长时间来猜测特定字符串,即使输入了正确数量的字符。我可以让代码运行,但我不知道如何让它每次运行时打印一个新字符串。我确定我在寻找一些简单的东西。下面是我尝试过的代码的几个示例。

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 移动到不同的地方,但不起作用,我只是收到不同的错误消息。

谁能帮帮我。

【问题讨论】:

  • 你需要在循环内计算随机数
  • 我试图在 while 语句中加入 `random=''.join([random.choice(string.ascii_letters+string.digits) for n in xrange(5)])' 但我不断收到以下错误。回溯(最后一次调用):文件“C:/Users/craig.walker/Desktop/new.py”,第 9 行,在 random=''.join([random.choice(string.ascii_letters+string .digits) for n in xrange(5)]) AttributeError: 'str' object has no attribute 'choice'
  • 将变量名称从random 更改为其他名称,并在while 循环中进行相应更改,或者将导入从import random 更改为import random as rand 并使用rand.choice。您正在使用关键字作为变量名。
  • 您可能还想看看Weasel 程序,它的运行速度比蛮力运行快很多。

标签: python string python-2.7 random brute-force


【解决方案1】:
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.choice 时,random(变量)正在覆盖random(库)并引发属性错误。

【讨论】:

    【解决方案2】:

    这里有两个问题。正如@Primusa 指出的那样,您的随机生成应该移动到您的循环中,否则它只会运行一次。但是,您的另一个问题是您正在导入random,并且您还将一个变量设置为random。这就是您的NameError 的来源。您已将 random 定义为一个字符串,该字符串适用于循环的第一次迭代。但是,在第二次迭代中,random 不会为它声明一个名为 choice 的函数,因为此时它是一个字符串。重命名 random 变量或在别名下导入 random 包,如下所示:

    import random as rnd
    

    【讨论】:

    • 谢谢,我正要发帖说我仍然遇到错误。这是因为我有 import random 和一个名为 random 的 var,它给了我一个奇怪的错误。谢谢它现在修好了!
    • @CraigWalker 不用担心。我以前做过同样的事情:)