我一直在研究一些代码来生成密码。我正在使用一些很酷的东西,如随机长度(由范围定义),一些大写和小写字符以及数字。我现在想制定一个小规则:
这是我的生成器及其规则的代码:
import random
length==random.randint(7,14)
ListOfChars=[]
codes=list(range(48,57))+list(range(65,90))+list(range(97,122))
for a in range(length):
ASCIIcode=random.choice(codes)
ListOfChars.append(chr(ASCIIcode))
print(''.join(ListOfChars)
在这里你可以看到已经定义了ascii范围以及变量长度7-14,但我似乎找不到再次生成相同char的方法,或者确保每个中至少有1个3个字符类型。
答案 0 :(得分:1)
以下应该很好用。它首先为密码中的每个条目构建一组要求并对其进行洗牌。然后,它根据该要求构建每个条目,并且没有相同的连续条目:
import string
length = random.randint(7, 14)
set1 = string.ascii_uppercase # A-Z
set2 = string.digits # 0-9
set3 = string.digits + string.ascii_letters # a-z A-Z 0-9
build = [set1, set2] + [set3] * (length - 2) # 1 uppercase, one digit, reset from full set
random.shuffle(build) # shuffle the order
password = []
index = 0
last = ''
while len(password) < length: # keep appending until length is reached
choice = random.choice(build[index])
if choice != last:
password.append(choice)
index += 1
last = choice
print ''.join(password)
给出如下结果:
6ZFTauQ
c6a29MTditDJUy
答案 1 :(得分:0)
正如我在评论中所建议的,这是解决这个问题的一种方法:
from string import ascii_lowercase, ascii_uppercase, digits
from random import randint, shuffle, sample
length = randint(7, 14)
length1 = randint(1, length - 2)
length2 = randint(1, length - length1 - 1)
length3 = randint(1, length - length1 - length2)
lengths = [length1, length2, length3]
shuffle(lengths)
subsets = list(map(sample, [ascii_lowercase, ascii_uppercase, digits], lengths))
result = subsets[0]
result.extend(subsets[1])
result.extend(subsets[2])
shuffle(result)
result = ''.join(result)
print(result)
我不知道它有多均匀,即它可能偏向更长的长度。