0

所以我正在做的是创建一个使用string.digits++的string.ascii_letters94char键string.punctuation

我用它来生成密钥(从这个站点获取,谢谢:))

def key_pass(size=94, chars=string.digits + string.ascii_letters + string.punctuation):
    return ''.join(random.choice(chars) for x in range(size))

它创造了这样的东西 9bMMqy-lB6Mt},bOxr@1ljey_\Z\gk`xRJBP;3YFR*i<N<!MB}_|0p3f5Q"l8'xEj)WHYGk7O]vQZ1cZ'(diMKS*gW%u$

我真正想做的是随机组织charsvar 中的 94 个字符。所以我不能有任何重复的东西我似乎无法获得正确的方法来实现一个检查变量的 if 语句

有什么建议吗?

4

2 回答 2

7

将它们放在一个列表中,然后使用randomshuffle 来犯错,好吧,将它们随机播放,然后将它们重新组合成一个字符串。

import string
import random

all_chars = list(string.digits + string.ascii_letters + string.punctuation)
random.shuffle(all_chars)
print ''.join(all_chars[:94])
于 2013-09-09T19:47:03.340 回答
5

我会使用random.sample

>>> import string, random
>>> chars=string.digits + string.ascii_letters + string.punctuation
>>> ''.join(random.sample(chars, 4))
'e_/p'
>>> ''.join(random.sample(chars, 10))
'a4NSq`%tQ#'

保证您永远不会有重复项——假设原件是唯一的,也就是说,可以通过调用set;来确保这一点。关键是同一个元素chars永远不会被绘制两次。 random.sample("aa", 2)会给["a", "a"]。如果你要求的元素比你拥有的多,你会得到一个很好的错误:

>>> ''.join(random.sample(chars, 100))
Traceback (most recent call last):
  File "<ipython-input-9-80959adcfe83>", line 1, in <module>
    ''.join(random.sample(chars, 100))
  File "/usr/lib/python2.7/random.py", line 320, in sample
    raise ValueError("sample larger than population")
ValueError: sample larger than population
于 2013-09-09T19:53:32.310 回答