【问题标题】:Generating random string and checking if is equal to a static string[Python]生成随机字符串并检查是否等于静态字符串[Python]
【发布时间】:2014-01-24 21:57:52
【问题描述】:
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

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

【问题讨论】:

  • 这样的字符串有 27^5 = 14348907(~1400 万)个。你书中的“无限期”有多长?我怀疑它比制作“七”的预期时间要短。现在,如果循环在 2800 万次迭代后仍在运行,那么您就可以开始担心了。
  • OP意识到荒谬了吗?
  • 请注意,if (randstring) == (checkstring) 永远不会是 True,因为它正上方的 while 只是检查了相反的情况。但这不是问题的原因。

标签: python string random


【解决方案1】:

27**5
Out[77]: 14348907

monkey 的可能排列。我想你只是等待的时间不够长。

但是,您确实有一个错误会导致count 永远不会被打印:

while(randString != checkstring):
           if(randString) == (checkstring):
              print(count)
              return True
           else:
              randString = monkey()
              count = count + 1

您的while 条件将在检查if 块之前跳出循环。将其更改为 while True: 并让您的休息条件爆发。

另外,优化:

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

''.join使用列表推导比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

输出:

found it in 62.897234201431274 seconds; took 12298282 iterations

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

【讨论】:

  • 更好的是,将当前的 then 块移动到循环之后,并且其中只有当前的 else 块。在我看来,更少的错误/错误和更清晰。另外,您能否引用列表理解更快的来源?这让我很吃惊。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    您可以尝试 smaller-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
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-29
      • 2019-08-22
      • 1970-01-01
      • 2014-02-09
      • 1970-01-01
      • 2017-08-01
      相关资源
      最近更新 更多