修改随机字生成器以确保特定字符类型

时间:2015-10-19 16:36:56

标签: python

我正在研究python,现在继续使用它。我一直在使用这个随机单词生成器,我正在修改它,以便它通过ascii代码从列表中选择字符。

import random
wordLen=random.randint(7,14)
charList=[]
asciiList=list(range(48,57))+list(range(65,90))+list(range(97,122))
for a in range(wordLen):
    ASCIIcode=random.choice(asciiList)
    charList.append(chr(ASCIIcode))
print(''.join(charList))

在这里你可以看到有一个名为asciiList的列表,其中我定义了数字,小写和大写。

现在我已将此分为三个列表,用于该程序的第二个版本:

length = random.randint(7, 14)

set1 = list(range(65,90))            # A-Z   
set2 = list(range(48,57))            # 0-9
set3 = list(range(97,122))           # a-z
build = [set1] + [set2] + [set3]

我无法尝试让程序确保生成的最终单词(根据我的完整程序)至少包含一个大写,一个小写和一个数字。我理解它是这样的(我在这里使用了不同的变量名称,因为我在一个新程序中写了这个):

while len(word) < length:                   # keep appending until the set length of 7-14 characters has been reached
choice = random.choice(build[index])

IE。直到程序达到确定的长度,从三组中的一组随机选择,但确保程序至少选择一次,但我正在努力完成最后一步。有没有人对程序的while循环有潜在的建议?建议赞赏!

2 个答案:

答案 0 :(得分:3)

您可以从每个必需的集合中选择一个字符,然后从整个集合中填充剩余的字符。之后,只需将剩余的字符串随机播放。

chars = [random.choice(s) for s in [set1, set2, set3]] +\
        [random.choice(build) for _ in range(length - 3)]
random.shuffle(chars)

chars = ''.join(map(chr, chars))

PS:你对build的定义可能是错误的。试试这个:

build = set1 + set2 + set3

让这段代码有效。

此外,您可以使用string模块提供您的设置

PS 2:如果您正在做一些密码生成器,出于安全原因,您可能需要在调用模块中的函数之前使用random = random.SystemRandom()。使用非确定性随机数生成器可能会避免可能重现您的数字生成器并预测您生成的密码的攻击。<​​/ p>

答案 1 :(得分:1)

import random

from string import ascii_uppercase, ascii_lowercase, ascii_letters, digits

pool = ascii_letters + digits
wordLen=random.randint(7,14)
answer = random.sample(pool, wordLen)

while True:
    if not any(char.isupper() for char in answer):
        answer[random.randrange(len(answer))] = random.choice(ascii_uppercase)
        continue

    if not any(char.islower() for char in answer):
        answer[random.randrange(len(answer))] = random.choice(ascii_lowercase)
        continue

    if not any(char.isdigit() for char in answer):
        answer[random.randrange(len(answer))] = random.choice(digits)
        continue

    break

answer = ''.join(answer)