我是新的编程,所以我不明白一些更深层次的东西.我有一个任务,创建密码数量,与给定的数字和密码longennes.我的第一个代码:
from random import choices, choice
def generate_password(m):
ch = choices('23456789qwertyupasdfghjkzxcvbnmiLQWERTYUPASDFGHJKZXCVBNM', k=m - 3)
ch.append(choice('LQWERTYUPASDFGHJKZXCVBNM'))
ch.append(choice('qwertyupasdfghjkzxcvbnmi'))
ch.append(choice('23456789'))
return ''.join(ch)
def main(n, m):
p = set()
t = 0
while t < n:
s = generate_password(m)
if s not in p:
t += 1
p.add(s)
return p
工作正常,但是时间太长了,所以后来我尝试了其他方法,随机改进部分代码。那么,为什么这段代码这么快?是不是shuffle()
更容易几次,然后只用choice()
?
x一个一个一个一个x一个一个二个x
输出:0.05657219886779785
from time import time
from random import choices, choice
def generate_password(m):
ch = choices('23456789qwertyupasdfghjkzxcvbnmiLQWERTYUPASDFGHJKZXCVBNM', k=m - 3)
ch.append(choice('LQWERTYUPASDFGHJKZXCVBNM'))
ch.append(choice('qwertyupasdfghjkzxcvbnmi'))
ch.append(choice('23456789'))
return ''.join(ch)
def main(n, m):
p = set()
t = 0
while t < n:
s = generate_password(m)
if s not in p:
t += 1
p.add(s)
return p
t1 = time()
print(*main(4609, 3))
t2 = time()
print(t2 - t1)
我没有等
2条答案
按热度按时间jyztefdp1#
这不是其中一个更快的问题。
该功能:
使用
m=3
,只能生成4608个不同的密码。choices
调用生成一个空列表,因为k=m-3
为0。然后,从2个24字符字符串和1个8字符串中随机选择,总共有24 * 24 * 8 = 4608个可能性。然后你试着循环,直到你生成了4609个不同的密码。
同时,使用此功能:
在循环之前,
ch
也可以是4608种可能性中的一种,但是如果你发现密码已经生成,你可以对ch
进行混洗,这意味着大写字母不再被限制在第一个位置,数字也不再被限制在最后。这个函数可以生成4608个以上的密码,所以一个试图用这个函数生成4609个不同密码的循环实际上可以结束,但是如果密码的所有6个排列都已经生成了,这个函数将无限期地对
ch
进行 Shuffle 。cuxqih212#
在第一种情况下,你用
m-2
个大写字母、一个小写字母和一个介于2和9之间的数字生成一个随机密码,然后如果没有重复,它就会被添加到密码集中。当你开始累积密码时,重复的几率会增加,所以在得到一个唯一的密码之前,你必须生成多个密码,这就是你提到的速度慢的问题。现在把它和第二种情况做个比较,如果密码是重复的,你就把字符混洗,直到它不再是重复的。现在,
m-2
大写字母、一个小写字母和一个数字的顺序不再适用,所以一个密码可以有更多的排列,大大降低了冲突的可能性,而且很可能“总是”发现它是一个唯一的密码。简单的回答是:后一个代码片段比前一个代码片段生成更多的唯一密码,从而降低了重复的可能性并大大提高了执行速度。