生成随机字符串并检查是否等于静态字符串[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