【问题标题】:Random Password Generator Keeps Generating the Same Password随机密码生成器不断生成相同的密码
【发布时间】:2014-11-27 19:05:19
【问题描述】:

我必须编写一个使用 Python 生成随机密码(使用 ASCII 值和 chr() 函数)的程序,并且我已经让我的程序生成随机密码,但是当程序循环时,它会一直打印相同的随机密码密码,我不知道该怎么做才能修复它。如果有人能给我一些建议,那就太好了,因为我是 python 新手

这是我目前的代码:

import random, string

LNGTH=8
position=0
password=""
start=0
stop=0

while start==stop:
    input("would you like a password?")
    while position<LNGTH:
        x=random.randrange(9)
        character=chr(random.randrange(97, 97 + 26))
        choice=[str(x),character.upper(),character.lower()]
        pass_pos=random.choice(choice)
        password=password+pass_pos
        position+=1

    print(password)

【问题讨论】:

  • 只是补充一点,虽然您的问题得到了很好的答案,但您可以通过使用调试器并一次单步执行代码来识别问题。您会立即看到while 语句只运行了一次。显而易见的下一步是检查while 上的条件,当您看到position 不是您预期的0 时。调试器是一种有价值的工具,学习使用它可以为您节省很多痛苦,尤其是在更复杂的代码中。希望对下次有帮助

标签: python python-3.x random


【解决方案1】:

您永远不会重置position,因此您的while 循环总是在生成第一个密码后返回True

因为您也没有重置password,这意味着您只生成一个随机密码并一遍又一遍地重新显示该值。

您需要重置两个内部外部while循环:

while start==stop:
    input("would you like a password?")
    position = 0
    password = ''

你可以在那里使用while True 而不是start == stop。您还可以使用 for 循环而不是内部的 while 循环,从而简化您的设置:

password = ''
for i in range(LNGTH):
    x=random.randrange(9)
    character=chr(random.randrange(97, 97 + 26))
    choice=[str(x),character.upper(),character.lower()]
    pass_pos=random.choice(choice)
    password=password+pass_pos

使用string.ascii_lettersstring.digits 进一步清理:

import string
import random

password_characters = string.ascii_letters + string.digits
length = 8

while True:
    if input("Would you like a password? ").lower() not in {'y', 'yes'}:
        break
    password = ''.join([random.choice(password_characters)
                        for _ in range(length)])
    print(password)

【讨论】:

  • 非常感谢!这更有意义 XD
【解决方案2】:

一旦你通过循环一次,position 等于LNGTH,所以循环while position&lt;LNGTH: 将立即退出。

在外循环内将position 设置为零,将password 设置为""

【讨论】:

    【解决方案3】:

    您的代码只生成一个密码并不断打印。那是因为它只运行一次循环while position &lt; LNGTH:在循环内,您增加位置直到密码足够长。但是在下一次迭代中,position 已经足够长了——所以不会进入while 循环;而是打印之前生成的密码。

    在进入while 循环之前,您必须将position 重置为零。

    【讨论】:

      【解决方案4】:

      此时您的程序每次都执行相同的操作,因此无需初始化随机数,您每次都会得到相同的随机数。 你应该先使用 random.seed() ,如果有的话,最好使用 random.SystemRandom()。

      【讨论】:

      • 这不是问题。
      猜你喜欢
      • 1970-01-01
      • 2012-11-06
      • 2010-09-08
      • 2020-05-11
      • 2014-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多