Python 生成具有区分大小写标准的密码
我一直在编写一些生成密码的代码。我使用了一些很酷的东西,比如由范围定义的随机长度,一些大小写字符,还有数字。我现在想做一个小规则集: 密码必须始终包含至少一个数字、一个大写字母和一个小写字母, 相邻字符不相同。 以下是我的生成器代码及其规则:Python 生成具有区分大小写标准的密码,python,Python,我一直在编写一些生成密码的代码。我使用了一些很酷的东西,比如由范围定义的随机长度,一些大小写字符,还有数字。我现在想做一个小规则集: 密码必须始终包含至少一个数字、一个大写字母和一个小写字母, 相邻字符不相同。 以下是我的生成器代码及其规则: import random length==random.randint(7,14) ListOfChars=[] codes=list(range(48,57))+list(range(65,90))+list(range(97,122)) fo
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,但我似乎找不到一种方法不再生成相同的字符,或者确保三种字符类型中至少有一种字符类型。正如我在评论中所建议的,这里有一种方法可以解决此问题:
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)
我不知道它有多均匀,也就是说,它可能会偏向更长的长度。以下内容应该可以很好地工作。它首先为密码中的每个条目构建一组需求,并对它们进行洗牌。然后,它基于该需求构建每个条目,并确保没有相同的连续条目:
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)
为什么相邻字符不能相同?这是一个好的密码规则吗?我爱我的密码,它们将永远成功!是一个很好的密码,因为它的长度很长,但它会因为双字母而不符合您的规则?@Ffisegydd你好!老实说,我只是在尝试用字符串规则来练习。我想知道在这种情况下,如何避免重复同样的事情。谢谢为了不重复字符,只需插入一个额外的while ascicode!=for循环中的PreviousAsciCode。对于整个问题,最简单的解决方案是从三个字符集中的每个字符集中选择一个随机子集,将子集连接起来,然后将其洗牌。唯一的缺点是每个字符都是唯一的,这比您指定的要严格一些。但考虑到你生成的是随机密码,这并不重要。这看起来很有趣,花了我相当长的时间来理解代码,但我想我明白了——你把它分成了子集。我想知道是否有一种更简单的方法可以沿着伪代码的行编码一行或两行:如果这行之前的字符与即将生成的字符相同,则生成一个新字符,然后再次检查?@MariuszAndrzejewski是的,我在对这个问题的评论中建议这样做。while循环是执行此操作的典型方法。想一想,如果你不知道怎么做,我会告诉你。然而,这并不能解决确保每一种角色都存在的问题。这个答案是我最喜欢的方式。非常感谢你的耐心。我决定研究一下while循环对这个概念来说是什么,并且已经起草了这个,它不起作用,但我觉得我现在理解了部分逻辑。我不知道python代码,但这部分有一个完整的伪代码:虽然ListOfChars-1=ListOfChars,如果在这个新的列表项之前的列表项=正在生成的新的列表项,那么重复生成stageP.s关于更长集合的一致性,答案似乎生成更长的长度,但可能只是我,如果你不提起它,我就不会注意到它!
6ZFTauQ
c6a29MTditDJUy