使用Python生成随机字符。

4

我希望生成一个16位字符的代码

该代码已知5个字符 该代码包含3个数字 代码必须是随机的

我的做法:

result1 = "NAA3U" + ''.join((random.choice(string.ascii_uppercase + string.digits) for codenum in range(11)))

请告诉我们您看到了哪些错误/漏洞,以便我们能够帮助您。 - Abdullah Ahmed
我没有错误,但代码中没有恰好包含3个数字。 - Biboune12
3个回答

8

一个方法:

import random
import string

# select 2 digits at random
digits = random.choices(string.digits, k=2)

# select 9 uppercase letters at random
letters = random.choices(string.ascii_uppercase, k=9)

# shuffle both letters + digits
sample = random.sample(digits + letters, 11)

result = "NAA3U" + ''.join(sample)
print(result)

输出 示例运行结果

NAA3U6MUGYRZ3DEX

如果代码需要至少包含3位数字,但不限于此阈值,则只需更改为以下行:

# select 11 uppercase letters and digits at random
letters = random.choices(string.ascii_uppercase + string.digits, k=11)

这将随机从大写字母和数字中选取。

在你的最终代码中,为什么把 k=9 改成了 k=11?这会使代码变成一个18字符的代码而不是16字符的,对吗?毕竟你还有两个额外生成的数字来确保它最终至少是三位数。 - Vincent Oostelbos
@VincentOostelbos 注意我正在从长度为11的“数字+字母”中进行选择,基本上那行代码是在打乱整个字符串。 - Dani Mesejo
我从11个数字中选择11个,所以保证其中2个来自“digits”。 - Dani Mesejo
我可能有点困惑。在string.ascii_uppercase + string.digits中,不是有36种可能的结果吗(26个大写字母和10个数字)?那么它不可能选择11个大写字母和0个数字吗?(或者选择10个大写字母和1个数字,但总体上仍然不够数字。) - Vincent Oostelbos
我理解,但是你有5个已知字符,2个数字和11个字母+数字,总共18个字符的代码。原始代码有5个已知字符,2个数字和9个字母,总共16个字符(这是要求)。所以我认为即使改变为string.ascii_uppercase + string.digits(这很好),k参数仍应设置为9而不是11,以保持总代码长度为16。 - Vincent Oostelbos
显示剩余2条评论

2
如果您认为这样可以,您可以在末尾添加剩余的两个数字。
import random
import string

result1 = "NAA3U" + ''.join((random.choice(string.ascii_uppercase) for codenum in range(8))) + str(random.randint(10,99))

print(result1)

NAA3URYWMGIHG45

我期望我的代码只包含3个数字。 - Biboune12
请告诉我,如果我的编辑解决了你的问题。 - Beluga
是的,我的错,应该是random.randint(10,99),而不是random.randint(1,99)。漏掉了一个零。 - Beluga
是的,除非您限制“0”字符的数量,并且“0”仅出现在末尾。 - quamrana
@Biboune12 的回答将适用于您,添加了我们缺少的随机性。 - Beluga
显示剩余3条评论

1
您可以使用 random.choicesrandom.shuffle,然后像下面这样使用 ''.join:
>>> import random
>>> import string

>>> def generate_rndm():
...    digit_char = random.choices(string.ascii_uppercase, k=9) + random.choices(string.digits, k=2)
...    random.shuffle(digit_char)
...    return "NAA3U" + ''.join(digit_char)

输出:

>>> generate_rndm()
'NAA3UTVQG8DT8NRM'

>>> generate_rndm()
'NAA3UCYBWCNQ45HR'

>>> generate_rndm()
'NAA3UIJP7W7DLOCQ'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接