使用大写字母和数字随机生成字符串

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

  • 6U1S75
  • 4Z4UKK
  • U911K4
1270931 次浏览

答案在一行:

''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(N))

或者更短,从Python 3.6开始使用#0

''.join(random.choices(string.ascii_uppercase + string.digits, k=N))

加密更安全的版本:看到这篇文章

''.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,一个包含常见ASCII字符序列的模块,和random,一个处理随机生成的模块。

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 randomimport string
char_set = string.ascii_uppercase + string.digitsprint ''.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 alphanumeralsr = (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 randomfrom string import digits, ascii_uppercase
legals = digits + ascii_uppercase
def rand_string(length, char_set=legals):
output = ''for _ in range(length): output += random.choice(char_set)return output

或者只是:

def rand_string(length, char_set=legals):
return ''.join( random.choice(char_set) for _ in range(length) )

如果你需要一个随机字符串而不是伪随机,你应该使用#0作为源

from os import urandomfrom itertools import islice, imap, repeatimport string
def rand_string(length=5):chars = set(string.ascii_uppercase + string.digits)char_gen = (c for c in imap(urandom, repeat(1)) if c in chars)return ''.join(islice(char_gen, None, length))

这个方法比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 & 31x = x >> 5return  ''.join(_ALPHABET[x] for x in chop(random.getrandbits(size * 5))).ljust(size, 'A')

…创建一个生成器,每次取出5位数字0…31直到没有留下

…将生成器的结果连接到具有正确位的随机数上

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

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

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

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

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

简单地使用Python的内置uuid:

如果UUID适合您的目的,请使用内置的uuid包。

单线解决方案:

import uuid; uuid.uuid4().hex.upper()[0:6]

深度版本:

示例:

import uuiduuid.uuid4() #uuid4 => full random uuid# Outputs something like: UUID('0172fc9a-1dac-4414-b88d-6b9a6feb91ea')

如果你需要你的格式(例如,“6U1S75”),你可以这样做:

import uuid
def my_random_string(string_length=10):"""Returns a random string of length string_length."""random = str(uuid.uuid4()) # Convert UUID format to a Python string.random = random.upper() # Make all characters uppercase.random = random.replace("-","") # Remove the UUID '-'.return random[0:string_length] # Return the random string.
print(my_random_string(6)) # For example, D9E50C

基于另一个Stack Overflow答案创建随机字符串和随机十六进制数的最轻量级方法,比接受的答案更好的版本是:

('%06x' % random.randrange(16**6)).upper()

更快。

>>> import random>>> str = []>>> chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'>>> num = int(raw_input('How long do you want the string to be?  '))How long do you want the string to be?  10>>> for k in range(1, num+1):...    str.append(random.choice(chars))...>>> str = "".join(str)>>> str'tm2JUQ04CK'

random.choice函数在列表中随机选择一个条目。您还可以创建一个列表,以便您可以在for语句中附加该字符。最后str是['t','m','2','J','U','Q','0','4','C','K'],但str = "".join(str)负责处理,留给您'tm2JUQ04CK'

希望这有帮助!

这个Stack Overflow问题是“随机字符串Python”的当前顶级Google结果。当前的顶级答案是:

''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(N))

这是一个很好的方法,但是随机中的PRNG不是加密安全的。我假设许多研究这个问题的人会想要生成随机字符串来进行加密或密码。你可以通过对上面的代码进行小的更改来安全地做到这一点:

''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(N))

使用random.SystemRandom()而不是随机使用 /dev/urandom*nix机器和Windows中的CryptGenRandom()。这些是加密安全的PRNG。在需要安全PRNG的应用程序中使用random.choice而不是random.SystemRandom().choice可能是潜在的毁灭性的,鉴于这个问题的流行,我敢打赌这个错误已经犯了很多次。

如果您使用的是python3.6或更高版本,您可以使用MSeifert的回答中提到的新秘密模块:

''.join(secrets.choice(string.ascii_uppercase + string.digits) for _ in range(N))

模块文档还讨论了生成安全令牌最佳做法的便捷方法。

一个更快、更简单、更灵活的方法是使用#0模块(pip install StringGenerator)。

生成一个包含大写字母和数字的6个字符的随机字符串:

>>> from strgen import StringGenerator as SG>>> SG("[\u\d]{6}").render()u'YZI2CI'

获取唯一列表:

>>> SG("[\l\d]{10}").render_list(5,unique=True)[u'xqqtmi1pOk', u'zmkWdUr63O', u'PGaGcPHrX2', u'6RZiUbkk2i', u'j9eIeeWgEF']

保证字符串中的一个“特殊”字符:

>>> SG("[\l\d]{10}&[\p]").render()u'jaYI0bcPG*0'

随机超文本标记语言颜色:

>>> SG("#[\h]{6}").render()u'#CEdFCa'

我们需要意识到这一点:

''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(N))

可能没有数字(或大写字符)。

strgen在开发人员时比上述任何解决方案都要快。Ignacio的解决方案是运行时执行最快的,也是使用Python标准库的正确答案。但是你几乎不会以那种形式使用它。你会想要使用SystemRandom(或者如果不可用则回退),确保表示所需的字符集,使用Unicode(或不使用),确保连续调用产生唯一的字符串,使用字符串模块字符类之一的子集,等等。这一切都需要比提供的答案更多的代码。泛化解决方案的各种尝试都有局限性,strgen使用简单的模板语言以更简洁和更强的表达能力解决了这些局限性。

在PyPI上:

pip install StringGenerator

披露:我是strgen模块的作者。

一个简单的:

import stringimport randomcharacter = string.lowercase + string.uppercase + string.digits + string.punctuationchar_len = len(character)# you can specify your password length herepass_len = random.randint(10,20)password = ''for x in range(pass_len):password = password + character[random.randint(0,char_len-1)]print password

对于那些喜欢函数式python的人:

from itertools import imap, starmap, islice, repeatfrom functools import partialfrom string import letters, digits, joinfrom random import choice
join_chars = partial(join, sep='')identity = lambda o: o
def irand_seqs(symbols=join_chars((letters, digits)), length=6, join=join_chars, select=choice, breakup=islice):""" Generates an indefinite sequence of joined random symbols each of a specific length:param symbols: symbols to select,[defaults to string.letters + string.digits, digits 0 - 9, lower and upper case English letters.]:param length: the length of each sequence,[defaults to 6]:param join: method used to join selected symbol,[defaults to ''.join generating a string.]:param select: method used to select a random element from the giving population.[defaults to random.choice, which selects a single element randomly]:return: indefinite iterator generating random sequences of giving [:param length]>>> from tools import irand_seqs>>> strings = irand_seqs()>>> a = next(strings)>>> assert isinstance(a, (str, unicode))>>> assert len(a) == 6>>> assert next(strings) != next(strings)"""return imap(join, starmap(breakup, repeat((imap(select, repeat(symbols)), None, length))))

它生成一个不确定的[无限]迭代器,连接的随机序列,通过首先从给池中生成一个随机选择的符号的不确定序列,然后将此序列分解为然后连接的长度部分,它应该与任何支持getitem的序列一起工作,默认情况下,它只是生成一个字母数字字母的随机序列,尽管您可以轻松修改以生成其他东西:

例如生成数字的随机元组:

>>> irand_tuples = irand_seqs(xrange(10), join=tuple)>>> next(irand_tuples)(0, 5, 5, 7, 2, 8)>>> next(irand_tuples)(3, 2, 2, 0, 3, 1)

如果你不想使用next for代,你可以简单地使它可调用:

>>> irand_tuples = irand_seqs(xrange(10), join=tuple)>>> make_rand_tuples = partial(next, irand_tuples)>>> make_rand_tuples()(1, 6, 2, 8, 1, 9)

如果您想动态生成序列,只需将连接设置为标识。

>>> irand_tuples = irand_seqs(xrange(10), join=identity)>>> selections = next(irand_tuples)>>> next(selections)8>>> list(selections)[6, 3, 8, 2, 2]

正如其他人提到的,如果您需要更多安全性,请设置适当的选择功能:

>>> from random import SystemRandom>>> rand_strs = irand_seqs(select=SystemRandom().choice)'QsaDxQ'

默认选择器是choice,它可以为每个块多次选择相同的符号,如果您希望每个块最多选择一次相同的成员,那么,一种可能的用法:

>>> from random import sample>>> irand_samples = irand_seqs(xrange(10), length=1, join=next, select=lambda pool: sample(pool, 6))>>> next(irand_samples)[0, 9, 2, 3, 1, 6]

我们使用sample作为我们的选择器,来完成选择,所以块实际上是长度1,并且加入我们只需调用next来获取下一个完全生成的块,授予这个例子似乎有点麻烦,它是…

>>> import string>>> import random

以下逻辑仍然生成6个字符的随机样本

>>> print ''.join(random.sample((string.ascii_uppercase+string.digits),6))JT7K3Q

不需要乘以6

>>> print ''.join(random.sample((string.ascii_uppercase+string.digits)*6,6))
TK82HK
import uuidlowercase_str = uuid.uuid4().hex

lowercase_str是一个像'cea8b32e00934aaea8c005a35d85a5c0'一样的随机值

uppercase_str = lowercase_str.upper()

uppercase_str'CEA8B32E00934AAEA8C005A35D85A5C0'

(1)这将为您提供所有大写和数字:

import string, randompasskey=''for x in range(8):if random.choice([1,2]) == 1:passkey += passkey.join(random.choice(string.ascii_uppercase))else:passkey += passkey.join(random.choice(string.digits))print passkey

(2)如果您以后想在键中包含小写字母,那么这也可以:

import string, randompasskey=''for x in range(8):if random.choice([1,2]) == 1:passkey += passkey.join(random.choice(string.ascii_letters))else:passkey += passkey.join(random.choice(string.digits))print passkey
import stringfrom random import *characters = string.ascii_letters + string.punctuation  + string.digitspassword =  "".join(choice(characters) for x in range(randint(8, 16)))print password

使用Numpy的random.choice()函数

import numpy as npimport string
if __name__ == '__main__':length = 16a = 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

从Python 3.6开始,您应该使用机密模块如果你需要密码保护的话而不是random模块(否则此答案与@Ignacio Vazquez-Abrams的答案相同):

from secrets import choiceimport string
''.join([choice(string.ascii_uppercase + string.digits) for _ in range(N)])

一个额外的注意事项:列表理解在str.join的情况下比使用生成器表达式更快!

这是阿努拉格·尤尼亚尔的回应,也是我自己正在努力的事情。

import randomimport string
oneFile = open('‪Numbers.txt', 'w')userInput = 0key_count = 0value_count = 0chars = string.ascii_uppercase + string.digits + string.punctuation
for userInput in range(int(input('How many 12 digit keys do you want?'))):while key_count <= userInput:key_count += 1number = random.randint(1, 999)key = number
text = str(key) + ": " + str(''.join(random.sample(chars*6, 12)))oneFile.write(text + "\n")oneFile.close()

我发现这更简单,更干净。

str_Key           = ""str_FullKey       = ""str_CharacterPool = "01234ABCDEFfghij~>()"for int_I in range(64):str_Key = random.choice(str_CharacterPool)str_FullKey = str_FullKey + str_Key

只需更改64以更改长度,更改特征池以执行仅字母数字或仅数字或奇怪字符或任何您想要的内容。

我建议你下一个选择:

import cryptn = 10crypt.crypt("any sring").replace('/', '').replace('.', '').upper()[-n:-1]

偏执模式:

import uuidimport cryptn = 10crypt.crypt(str(uuid.uuid4())).replace('/', '').replace('.', '').upper()[-n:-1]

方法二:

import random, math

def randStr_1(chars:str, length:int) -> str:chars *= math.ceil(length / len(chars))chars = letters[0:length]chars = list(chars)random.shuffle(characters)
return ''.join(chars)

def randStr_2(chars:str, length:int) -> str:return ''.join(random.choice(chars) for i in range(chars))


基准:

from timeit import timeit
setup = """import os, subprocess, time, string, random, math
def randStr_1(letters:str, length:int) -> str:letters *= math.ceil(length / len(letters))letters = letters[0:length]letters = list(letters)random.shuffle(letters)return ''.join(letters)
def randStr_2(letters:str, length:int) -> str:return ''.join(random.choice(letters) for i in range(length))"""
print('Method 1 vs Method 2', ', run 10 times each.')
for length in [100,1000,10000,50000,100000,500000,1000000]:print(length, 'characters:')
eff1 = timeit("randStr_1(string.ascii_letters, {})".format(length), setup=setup, number=10)eff2 = timeit("randStr_2(string.ascii_letters, {})".format(length), setup=setup, number=10)print('\t{}s : {}s'.format(round(eff1, 6), round(eff2, 6)))print('\tratio = {} : {}\n'.format(eff1/eff1, round(eff2/eff1, 2)))

输出:

Method 1 vs Method 2 , run 10 times each.
100 characters:0.001411s : 0.00179sratio = 1.0 : 1.27
1000 characters:0.013857s : 0.017603sratio = 1.0 : 1.27
10000 characters:0.13426s : 0.151169sratio = 1.0 : 1.13
50000 characters:0.709403s : 0.855136sratio = 1.0 : 1.21
100000 characters:1.360735s : 1.674584sratio = 1.0 : 1.23
500000 characters:6.754923s : 7.160508sratio = 1.0 : 1.06
1000000 characters:11.232965s : 14.223914sratio = 1.0 : 1.27

第一种方法的性能较好。

import randomq=2o=1list  =[r'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','s','0','1','2','3','4','5','6','7','8','9','0']while(q>o):print("")
for i in range(1,128):x=random.choice(list)print(x,end="")

这里可以在for循环中更改字符串的长度,即在范围(1,长度)中更改i这是简单的算法,很容易理解.它使用列表,所以你可以丢弃字符,你不需要.

我已经检查了几乎所有的答案,但没有一个看起来更容易。我建议您尝试Passgen库,它通常用于创建随机密码。

您可以生成您选择的长度、标点符号、数字、字母案例。的随机字符串

以下是您案例的代码:

from passgen import passgenstring_length = int(input())random_string = passgen(length=string_length, punctuation=False, digits=True, letters=True, case='upper')

有时0(零)和O(字母O)可能会令人困惑。所以我用

import uuiduuid.uuid4().hex[:6].upper().replace('0','X').replace('O','Y')

生成包含字母、数字、“_”和“-”的随机16字节ID

os.urandom(16).translate((f'{string.ascii_letters}{string.digits}-_'*4).encode('ascii'))

import string, randomlower = string.ascii_lowercaseupper = string.ascii_uppercasedigits = string.digitsspecial = '!"£$%^&*.,@#/?'
def rand_pass(l=4, u=4, d=4, s=4):p = [][p.append(random.choice(lower)) for x in range(l)][p.append(random.choice(upper)) for x in range(u)][p.append(random.choice(digits)) for x in range(d)][p.append(random.choice(special)) for x in range(s)]random.shuffle(p)return "".join(p)
print(rand_pass())# @5U,@A4yIZvnp%51

我看着不同的答案,花时间阅读秘密的留档

秘密模块用于生成密码强随机数,适用于管理密码、帐户身份验证、安全令牌和相关秘密等数据。

特别是,秘密应该优先于随机模块中的默认伪随机数生成器,后者是为建模和仿真而设计的,而不是安全或密码学。

深入研究它所提供的功能,我发现了一个非常方便的功能,如果你想模仿像Google Drive ID这样的ID:

secrets.token_urlsafe
返回一个随机URL安全的文本字符串,包含nbytes随机字节。文本是Base64编码的,因此平均每个字节的结果大约为1.3字符。如果nbytes为无或未提供,则使用合理的默认值。

按照以下方式使用它:

import secretsimport math
def id_generator():id = secrets.token_urlsafe(math.floor(32 / 1.3))return id
print(id_generator())

输出32个字符长度的id:

joXR8dYbBDAHpVs5ci6iD-oIgPhkeQFk

我知道这与OP的问题略有不同,但我希望它仍然会对许多正在寻找我正在寻找的相同用例的人有所帮助。

如果您想要一个易于使用但高度可定制的密钥生成器,请使用key-generator pypi包。

这里是GitHub存储库,您可以在其中找到完整的留档。

你可以自定义它以提供一个你想要的字符串jist,并提供更多选项。这是一个例子:

from key_generator.key_generator import generate
custom_key = generate(2, ['-', ':'], 3, 10, type_of_value = 'char', capital = 'mix', seed = 17).get_key()print(custom_key)  # ZLFdHXIUe-ekwJCu

希望有帮助:)

免责声明:这使用了我制作的key-generator库。

你现在可以使用一个新库(python>=3.6)chancepy这里

from chancepy import Chance
random_string = Chance.string(length=10, pool="someLettersAndNumbers123")

到目前为止,没有一个答案保证存在某些类别的字符,如上、下、数字等;所以其他答案可能会导致密码没有数字等。惊讶的是,这样的函数不是标准库的一部分。这是我使用的:

def random_password(*, nchars = 7, min_nupper = 3, ndigits = 3, nspecial = 3, special=string.punctuation):letters = random.choices(string.ascii_lowercase, k=nchars)letters_upper = random.choices(string.ascii_uppercase, k=min_nupper)digits = random.choices(string.digits, k=ndigits)specials = random.choices(special, k=nspecial)
password_chars = letters + letters_upper + digits + specialsrandom.shuffle(password_chars)
return ''.join(password_chars)

我使用这种方法从a->z生成长度为n的随机字符串

import randoms = ''.join(random.choice([chr(i) for i in range(ord('a'),ord('z'))]) for _ in range(10))

面向安全的方法

我们对任何与安全相关的建议是避免“滚动你自己”,并使用专门审查安全性的机密模块

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

import stringimport secretsalphabet = string.ascii_letters + string.digitspassword = ''.join(secrets.choice(alphabet) for i in range(8))

由于您特别要求使用大写字母,因此您可以将ascii_uppercase替换为ascii_letters,或者仅将密码大写为:

password = password.upper()

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

此问题的规范方法(如指定)使用随机模块中的选择()函数:

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

无重复的随机生成函数使用set来存储之前生成的值。请注意,这将消耗一些具有非常大的字符串或数量的内存,并且可能会减慢一点。generator将在给定数量或达到最大可能组合时停止。

代码:

#!/usr/bin/env python
from typing import Generatorfrom random import SystemRandom as RNDfrom string import ascii_uppercase, digits

def string_generator(size: int = 1, amount: int = 1) -> Generator[str, None, None]:"""Return x random strings of a fixed length.
:param size: string length, defaults to 1:type size: int, optional:param amount: amount of random strings to generate, defaults to 1:type amount: int, optional:yield: Yield composed random string if unique:rtype: Generator[str, None, None]"""CHARS = list(ascii_uppercase + digits)LIMIT = len(CHARS) ** sizecount, check, string = 0, set(), ''while LIMIT > count < amount:string = ''.join(RND().choices(CHARS, k=size))if string not in check:check.add(string)yield stringcount += 1

for my_count, my_string in enumerate(string_generator(6, 20)):print(my_count, my_string)

输出:

0 RS9N3P1 S0GDGR2 ZNBLFV3 96FF974 38JJZ35 Q3214A6 VLWNK17 QMT05E8 X1ZFP09 MZF44210 10L9AZ11 GE8HIQ12 S7PA4313 MVLXO914 YX7Y0G15 GIIKPF16 3KCUQA17 XHIXFV18 BJQ5VG19 HQF01Q

如果你的字符串总是需要包含字母和数字,使用:

#!/usr/bin/env python
from typing import Generatorfrom random import SystemRandom as RNDfrom string import ascii_uppercase, digits

def string_generator(size: int = 2, amount: int = 1) -> Generator[str, None, None]:"""Return x random strings of a fixed length.
:param size: string length, defaults to 1:type size: int, optional:param amount: amount of random strings to generate, defaults to 1:type amount: int, optional:yield: Yield composed random string if unique:rtype: Generator[str, None, None]"""if size < 2:print('Since the string must contain letters and numbers,','its size must be at least two characters',)returnCHARS = list(ascii_uppercase + digits)LIMIT = len(CHARS) ** sizecount, check, string = 0, set(), ''while LIMIT > count < amount:while 1:string = ''.join(RND().choices(CHARS, k=size))if not (string.isalpha() or string.isnumeric()):breakif string not in check:check.add(string)yield stringcount += 1

for my_count, my_string in enumerate(string_generator(6, 20)):print(my_count, my_string)

输出:

0 5JIITL1 3W7AI12 8QMO103 ETHAI84 BLFPP95 50X2CC6 1LI8WA7 39CKET8 R4IM0E9 Q3KHGS10 65CBIU11 XTRHO412 N2XIGO13 06VFCW14 VE9MJ815 A9ADHK16 Y5ROJ017 OH7EJF18 TQ709S19 P0DDNJ

使用此代码快速生成重复随机文本值的字符串:

import stringimport random
def id_generator(size=6, chars=string.ascii_uppercase + string.digits):return ''.join(random.choice(chars) for _ in range(size))
moja_lista = []for a in range(20):moja_lista.append(id_generator(3, "3etrY"))

你得到20个重复的随机文本值。生成器从集合“3etrY”集中生成三分量元素。一切都可以随心所欲地设置。

print(len(moja_lista))moja_lista

输入图片描述