我的问题是:如何生成随机密码,其长度在每次生成时(8到12个字符)不等。
这是我的代码:
import string
import random
def randompassword():
chars=string.ascii_uppercase + string.ascii_lowercase + string.digits
size=8
return ''.join(random.choice(chars) for x in range(size,12))
print(randompassword())
答案 0 :(得分:8)
size = 8; range(size, 12)
始终返回数组[8,9,10,11]
,因此您始终可以获得长度为4的密码。
相反,请提前使用randint
确定此特定密码的大小:
import string
import random
def randompassword():
chars = string.ascii_uppercase + string.ascii_lowercase + string.digits
size = random.randint(8, 12)
return ''.join(random.choice(chars) for x in range(size))
答案 1 :(得分:1)
import random
import string
def randompassword():
return ''.join([random.choice(string.printable) for _ in range(random.randint(8, 12))])
答案 2 :(得分:0)
range(size,12)
仅返回size
(您已硬编码为8)和12之间的数字,因此您的密码长度只有4个字符。制作... for x in range(size)
。
答案 3 :(得分:0)
我认为由于size = 8
和range(size,12)
,它只打印4个字符。这转换为范围(8,12)= 4个字符。您可以增加第二个数字以分配更大的范围来打印随机字符,如此
import string
import random
def randompassword():
chars=string.ascii_uppercase + string.ascii_lowercase + string.digits
size= 8
return ''.join(random.choice(chars) for x in range(size,20))
print(randompassword())
另外请务必查看python的随机文档here。
答案 4 :(得分:0)
这个问题有几个细微差别:
string.printable
,但这并不是一个好主意,因为它包含空格字符。虽然它们对于密码并非严格违法,但您无法轻易看到它们,因此无法区分(例如)来自多个空格的标签(依此类推)。 下面我只使用较低的&大写字母,数字和标点字符。random.choices()
(如在其他答案中),则还应使用weights=
和cum_weights=
选项,以通过平衡分发来消除上述偏见。secrets
模块而不是其random
模块用于此用例。来自documentation on random:警告:不应使用此模块的伪随机生成器 出于安全目的。有关安全性或加密用途,请参阅 secrets模块。
这是使用 Python-3 的一个面向功能的解决方案。它仅使用secrets.choice()
。它并没有完全解决随机问题(其他细微差别仍然存在),但它确实改善了选择分布以减少偏差:
>>> import string, secrets
>>> char_classes = (string.ascii_lowercase,
string.ascii_uppercase,
string.digits,
string.punctuation)
>>> size = lambda: secrets.choice(range(8,13)) # Chooses a password length.
>>> char = lambda: secrets.choice(secrets.choice(char_classes)) # Chooses one character, uniformly selected from each of the included character classes.
>>> pw = lambda: ''.join([char() for _ in range(size())]) # Generates the variable-length password.
DEMO :使用从每个字符类统一选择的字符生成10个可变长度的密码字符串:
>>> for i in range(1,11):
>>> p = pw()
>>> print('%i) %i chars :: %s' % (i,len(p),p))
1) 11 chars :: IwWNEAUmnJt
2) 10 chars :: ;N/'tO6RTv
3) 8 chars :: l=5.2CDh
4) 10 chars :: V0=I+A`t2Q
5) 12 chars :: PQm8:f,#56"9
6) 10 chars :: KOdx9~%r;F
7) 11 chars :: <?67U8}3>F{
8) 11 chars :: G$5y~3fE7o*
9) 10 chars :: 70,|=Rexwn
10) 8 chars :: &31P^@cU
最后,虽然我们在此处使用secrets
模块,但可以使用numpy
和numpy.random
完成类似的操作。我希望这有帮助!
答案 5 :(得分:0)
string.ascii_letters #考虑所有大小写字母。 string.digits (#)包含0到9位数字。 string.punctuation #考虑特殊字符,例如符号。 random.choice (#)考虑从给定的数据中随机选择。 range(random.randint(6,12))#考虑从给定数据中选择一个随机的int范围。 print(generator_pw())#打印随机生成的密码。
import random, string
def generator_pw():
pwd = string.ascii_letters + string.digits + string.punctuation
return "".join(random.choice(pwd) for x in range(random.randint(6, 12)))
print(generator_pw())