生成随机字符串并检查是否等于静态字符串[Python]

生成随机字符串并检查是否等于静态字符串[Python],python,string,random,Python,String,Random,我想生成一个随机字符串并检查该字符串是否等于静态字符串,然后我想让程序继续运行,直到随机生成的字符串等于静态字符串(在本例中为“七”)。随机字符串生成工作正常,但我的循环似乎无限运行,而不是在达到条件后停止。有人能帮我正确地停止无限循环吗?你的monkey()方法可以创建27^5==14348907(1400万)个不同的字符串。在随机创建特定字符串seven之前(统计上)需要相当长的时间。再等一会儿。有 characters ='abcdefghijklmnopqrstuvwxyz ' def

我想生成一个随机字符串并检查该字符串是否等于静态字符串,然后我想让程序继续运行,直到随机生成的字符串等于静态字符串(在本例中为“七”)。随机字符串生成工作正常,但我的循环似乎无限运行,而不是在达到条件后停止。有人能帮我正确地停止无限循环吗?

你的
monkey()
方法可以创建27^5==14348907(1400万)个不同的字符串。在随机创建特定字符串
seven
之前(统计上)需要相当长的时间。再等一会儿。

characters ='abcdefghijklmnopqrstuvwxyz '

def monkey():
    return ''.join(random.choice(characters) for i in range(5))

def checkif():
     checkstring = "seven"
     randString = monkey()
     count = 1

     while(randString != checkstring):
           if(randString) == (checkstring):
              print(count)
              return True
           else:
              randString = monkey()
              count = count + 1
猴子的可能排列
。我想你只是等得不够久

但是,您确实有一个bug,它会导致
count
无法打印:

27**5
Out[77]: 14348907
如果选中
块,则
while
条件将在
之前中断循环。将其更改为
,而为True:
,然后让您的中断条件中断

此外,优化:

while(randString != checkstring):
           if(randString) == (checkstring):
              print(count)
              return True
           else:
              randString = monkey()
              count = count + 1
'.join
使用列表理解比使用生成器表达式更快

因此,重温所有代码(加入一些小的语法升级和计时器):

产出:

def monkey():
    return ''.join([random.choice(characters) for i in range(5)])

def checkif():
     checkstring = "seven"
     randString = monkey()
     count = 1
     start = time.time()

     while True:
           if randString == checkstring:
              print('found it in {} seconds; took {} iterations'.format(time.time() - start, count))
              return
           else:
              randString = monkey()
              count = count + 1

显然,你的里程数可能会因找到猴子而有所不同:-)

27*27*27*27*27=14348907
可能性。需要很长时间才能获得与所需字符串相等的字符串

您可以尝试使用较小长度的测试:

并更改
monkey()
length结果(仅用于测试)。通过这个较小的示例,您可以看到程序按预期工作:

def checkif():
     checkstring = "se" # length:2
     randString = monkey()
     count = 1

     while True: # Infinite loop
           if(randString) == (checkstring): # This will take care of loop exit
              print(count)
              return True
           else:
              randString = monkey()
              count = count + 1

有27^5=14348907(~1400万)个这样的字符串。你的书中“无限期”有多长?我怀疑这比《七》预计的制作时间要短。现在,如果循环在2800万次迭代后仍在运行,那么你就可以开始担心了。OP意识到荒谬吗?请注意,
if(randstring)==(checkstring)
将永远不会为真,因为它上面的
while
只是检查了相反的情况。但这不是问题的原因。更好的是,将当前块移动到循环后面,并且只在其内部有当前块。在我看来,更少的错误/错误倾向和更清晰。另外,你能举出清单上的信息来源吗?这让我很惊讶。
found it in 62.897234201431274 seconds; took 12298282 iterations
def checkif():
     checkstring = "se" # length:2
     randString = monkey()
     count = 1

     while True: # Infinite loop
           if(randString) == (checkstring): # This will take care of loop exit
              print(count)
              return True
           else:
              randString = monkey()
              count = count + 1
def monkey():
    return ''.join(random.choice(characters) for i in range(2)) # length: 2