用一句话回答:
''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(N))
或者从Python 3.6开始使用random.choice()
,甚至更短。
''.join(random.choices(string.ascii_uppercase + string.digits, k=N))
一个在密码学上更安全的版本;见https://stackoverflow.com/a/23728630/2213647:。
''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(N))
在细节上,有一个干净的函数供进一步重用:
>>> import string
>>> import random
>>> def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
... return ''.join(random.choice(chars) for _ in range(size))
...
>>> id_generator()
'G5G74W'
>>> id_generator(3, "6793YUIO")
'Y3U'
它是如何工作的?
我们导入 "string "和 "random",前者是一个包含普通ASCII字符序列的模块,后者是一个处理随机生成的模块。
string.ascii_uppercase + string.digits
只是将代表大写ASCII字符和数字的字符列表连接起来。
>>> string.ascii_uppercase
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> string.digits
'0123456789'
>>> string.ascii_uppercase + string.digits
'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
然后我们使用列表理解来创建一个'n'元素的列表。
>>> range(4) # range create a list of 'n' numbers
[0, 1, 2, 3]
>>> ['elem' for _ in range(4)] # we use range to create 4 times 'elem'
['elem', 'elem', 'elem', 'elem']
在上面的例子中,我们使用 [
来创建列表,但是我们在 id_generator
函数中没有这样做,所以 Python 并没有在内存中创建列表,而是在飞行中一个一个地生成元素 (更多关于这一点 这里)。
我们不要求创建 'n'次字符串 elem
,而是要求 Python 创建 'n'次随机字符,从一串字符中挑选。
>>> random.choice("abcde")
'a'
>>> random.choice("abcde")
'd'
>>> random.choice("abcde")
'b'
因此random.choice(chars) for _ in range(size)
实际上是创建一个`size'字符序列。从 "chars "中随机抽取的字符。
>>> [random.choice('abcde') for _ in range(3)]
['a', 'b', 'b']
>>> [random.choice('abcde') for _ in range(3)]
['e', 'b', 'e']
>>> [random.choice('abcde') for _ in range(3)]
['d', 'a', 'c']
然后我们用一个空字符串连接它们,这样序列就变成了一个字符串。
>>> ''.join(['a', 'b', 'b'])
'abb'
>>> [random.choice('abcde') for _ in range(3)]
['d', 'c', 'b']
>>> ''.join(random.choice('abcde') for _ in range(3))
'dac'
一个更简单、更快速但随机性稍差的方法是使用random.sample
,而不是单独选择每个字母,如果允许n次重复,将你的随机基础扩大n倍,例如。
import random
import string
char_set = string.ascii_uppercase + string.digits
print ''.join(random.sample(char_set*6, 6))
注意。 random.sample防止了字符的重复使用,乘以字符集的大小使多次重复成为可能,但它们的可能性仍然低于纯随机选择。如果我们选择一个长度为6的字符串,并选择'X'作为第一个字符,在选择的例子中,获得'X'作为第二个字符的几率与获得'X'作为第一个字符的几率相同。在random.sample的实现中,得到'X'作为任何后续字符的几率只有得到它作为第一个字符的6/7。
我以为还没有人回答这个问题呢!但是,嘿嘿,这是我自己的想法。但是,这是我自己的想法。
import random
def random_alphanumeric(limit):
#ascii alphabet of all alphanumerals
r = (range(48, 58) + range(65, 91) + range(97, 123))
random.shuffle(r)
return reduce(lambda i, s: i + chr(s), r[:random.randint(0, len(r))], "")