2016-05-20 32 views
1

我需要生成随机的32位数字以及15个字符的字符串,以获得类似09826843-5112-8345-7619-372151470268qcRtAhieRabnpUaQ的内容。我用下面的代码生成号码:如何生成随机模块不区分大小写的字符串

import random 

"-".join(['%08d' % random.randrange(0, 10e7), 
      '%04d' % random.randrange(0, 10e3), 
      '%04d' % random.randrange(0, 10e3), 
      '%04d' % random.randrange(0, 10e3), 
      '%012d' % random.randrange(0, 10e11)]) 

有没有类似的方法来创建区分大小写的15字符的字符串只random模块?

回答

1
import random 

rand_cap = [chr(random.randint(65, 90)) for i in range(7)] 
rand_small = [chr(random.randint(97, 122)) for i in range(7)] 
rand_chars_list = rand_cap + rand_small 

random.shuffle(rand_chars_list) 

rand_chars = ''.join(rand_chars_list) 
+0

这个解决方案是在没有替换的情况下进行随机抽取('shuffle'),你应该在这里进行替换('sample')。如果你检查这个问题,你会看到示例随机字符串中有两个“a”。你的方法不能产生这个。 – wildwilhelm

+0

@wildwilhelm我用上面的方法生成''uEladCFBEatFgA''(2'a's)。你在这个例子的随机字符串中“two'a”是什么意思?你的方法不能产生这个“? –

+0

糟糕!我错了,没有仔细阅读。 – wildwilhelm

3
import random 
import string 
''.join(random.sample(string.ascii_letters, 15)) 

import uuid 
str(uuid.uuid4()) 
+0

注意https://docs.python.org/2/library/random.html#random.sample没有替换。所以,第一种方法不能产生具有两个或更多相似数字的字符串。 –

3
import numpy as np 
import random 
import string 


def random_string(num_chars, symbols):  
    return "".join(random.choice(symbols) 
        for _ in range(num_chars)) 


def random_string2(num_chars, symbols, replace=True): 
    """Random string with replacement option""" 
    symbols = np.asarray(list(symbols)) 
    return "".join(np.random.choice(symbols, num_chars, replace)) 

def main(): 
    print(random_string(15, string.ascii_letters)) 
    print(random_string2(15, string.ascii_letters, False)) 
    print(random_string2(15, string.ascii_letters, True)) 


if __name__ == "__main__": 
    main() 

注意,在字符串元素不必是唯一的(我假定是这种情况,因为“qcRtAhieRabnpUaQ”具有2“”)。

如果您希望元素是唯一的,那么@Sergey Gornostaev的解决方案可能是最优雅的,但这会将ascii_letters中的唯一元素的数量强加为您可以生成的最长字符串。

相关问题