密码字符的构成:52个大小写英文字母,10个阿拉伯数字(0~9),以及下划线"_"中的任意字符;
生成的密码,不允许出现连续两个字符的ASCII码是相邻或相同的。即如果生成的密码为"dAlsy5gh"、"RihLaaBU",则被视为不符合要求,不计入密码条数内。
将生成过程中不符合要求的也列出
这个题的难点其实不是随机生成,而是过滤掉不符合的情况。
import random
UChar='ABCDEFGHIGKLMNOPQRSTUVWXYZ'
LChar='abcdefghijklmnopqrstuvwxyz'
NChar='0123456789'
AChar=UChar+NChar+'_'+LChar
def OkS(inS):
for i in range(7):
if inS[i] == inS[i+1] : # 处理相同的情况
return False
if (inS[i] in UChar ) and (inS[i+1] in UChar):
AIdx=UChar.find(inS[i])
BIdx=UChar.find(inS[i+1])
if (AIdx-BIdx) == 1 or (BIdx-AIdx) ==1 :
return False
elif (inS[i] in LChar ) and (inS[i+1] in LChar):
AIdx=LChar.find(inS[i])
BIdx=LChar.find(inS[i+1])
if (AIdx-BIdx) == 1 or (BIdx-AIdx) ==1 :
return False
elif (inS[i] in NChar ) and (inS[i+1] in NChar):
AIdx=NChar.find(inS[i])
BIdx=NChar.find(inS[i+1])
if (AIdx-BIdx) == 1 or (BIdx-AIdx) ==1 :
return False
return True
sCount=0
while sCount<10:
aS=''
for i in range(8):
aS=aS + AChar[ random.randint(0,51) ]
if OkS(aS):
sCount=sCount+ 1
print("第{}个符合条件密码:{}".format(sCount,aS) )
else :
print("不符合条件密码:{}".format(aS))
一个简单的实现
望采纳,谢谢!
import random
import string
def getcode():
return ''.join(random.sample(string.ascii_letters + string.digits + '_', 8))
count = 0
while count < 10:
code = getcode()
for i in range(len(code) -1):
if ord(code[i]) ==ord(code[i+1]) +1 or ord(code[i]) == ord(code[i+1]) or ord(code[i]) == ord(code[i+1]) -1:
print("不合格:{}".format(code))
break
else:
print(code)
count += 1
break
import string
import random
s = string.ascii_letters+string.digits+'_'
res = []
while len(res)<10:
p = random.choices(s,k=8)
tp = [ord(i) for i in p]
for k in range(len(tp)-1):
if tp[k] == tp[k+1] or tp[k]-1 == tp[k+1] or tp[k]+1 ==tp[k+1]:
print("不合格",''.join(p))
break
else:
res.append(''.join(p))
print(res)