如何生成大小为N的字符串,由数字和大写英文字母组成,例如:

6个754z4英国U911K4型


当前回答

面向安全的方法

我们对任何安全相关的建议都是避免“自己动手”,并使用经过专门安全审查的机密模块。

这来自文档的最佳实践部分:

import string
import secrets
alphabet = string.ascii_letters + string.digits
password = ''.join(secrets.choice(alphabet) for i in range(8))

由于您特别要求使用大写字母,因此您可以用ascii_capsaper替换ascii_cletters,或者只使用以下内容将密码大写:

password = password.upper()

不以安全为目的的标准方法

这个问题的规范方法(如指定)使用随机模块中的choices()函数:

>>> from random import choices
>>> from string import ascii_uppercase, digits

>>> population = ascii_uppercase + digits
>>> str.join('', choices(population, k=6))
'6JWF1H'

其他回答

我以为还没有人回答这个问题,哈哈!但嘿,这是我自己的尝试:

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))], "")
import uuid
lowercase_str = uuid.uuid4().hex  

lowercase_str是一个随机值,如“cea8b32e0934aae8c005a35d85a5c0”

uppercase_str = lowercase_str.upper()

上机匣_str为“CEA8B32E00934AAEA8C005A35D85A5C0”

这个方法比Ignacio发布的random.choice()方法稍快,也稍令人讨厌。

它利用了伪随机算法的特性,按位和移位的存储体比为每个字符生成新的随机数更快。

# must be length 32 -- 5 bits -- the question didn't specify using the full set
# of uppercase letters ;)
_ALPHABET = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789'

def generate_with_randbits(size=32):
    def chop(x):
        while x:
            yield x & 31
            x = x >> 5
    return  ''.join(_ALPHABET[x] for x in chop(random.getrandbits(size * 5))).ljust(size, 'A')

…创建一个生成器,该生成器每次从0..31取出5位数字,直到没有剩余

…join()生成器对随机数的结果与正确的位

使用Timeit,对于32个字符串,计时为:

[('generate_with_random_choice', 28.92901611328125),
 ('generate_with_randbits', 20.0293550491333)]

…但对于64个字符串,randbits会丢失;)

除非我真的不喜欢我的同事,否则我可能永远不会在生产代码中使用这种方法。

edit:更新以适应问题(仅限大写和数字),并使用按位运算符&和>>而不是%和//

import string
from random import *
characters = string.ascii_letters + string.punctuation  + string.digits
password =  "".join(choice(characters) for x in range(randint(8, 16)))
print password

使用Numpy的随机choice()函数

import numpy as np
import string        

if __name__ == '__main__':
    length = 16
    a = np.random.choice(list(string.ascii_uppercase + string.digits), length)                
    print(''.join(a))

文档在这里http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.random.choice.html