生成大量随机字符串

时间:2016-10-18 18:17:01

标签: python string python-2.7 random

我有一个方法可以生成50,000个随机字符串,将它们全部保存到文件中,然后运行该文件,并删除所有出现的字符串重复项。在使用set()生成唯一字符串后,在这50,000个随机字符串中,平均剩下63个字符串。

生成字符串的函数:

def random_strings(size=8, chars=string.ascii_uppercase + string.digits + string.ascii_lowercase):
    return ''.join(random.choice(chars) for _ in xrange(size))

删除重复项:

    with open("dicts/temp_dict.txt", "a+") as data:
        created = 0
        while created != 50000:
            string = random_strings()
            data.write(string + "\n")
            created += 1
            sys.stdout.write("\rCreating password: {} out of 50000".format(created))
            sys.stdout.flush()

        print "\nRemoving duplicates.."
        with open("dicts\\rainbow-dict.txt", "a+") as rewrite:
            rewrite.writelines(set(data))

之前和之后的示例: https://gist.github.com/Ekultek/a760912b40cb32de5f5b3d2fc580b99f

如何生成完全随机的唯一字符串而不重复?

2 个答案:

答案 0 :(得分:3)

您可以从头开始使用 set

created = set()
while len(created) < 50000:
    created.add(random_strings())

在循环外保存一次

答案 1 :(得分:0)

您可以通过生成唯一数字来保证唯一字符串,从随机数开始是可能性总数的1/50000 th 的范围(62 8 )。然后生成更多随机数,每次确定可以选择下一个数字的窗口。这不是完全随机,但我相信它实际上足够接近。

然后,通过考虑62个基数的表示,可以将这些数字转换为字符串。下面是代码,最后检查确实所有50000个字符串都是唯一的:

import string
import random

def random_strings(count, size=8, chars=string.ascii_uppercase + string.digits + string.ascii_lowercase):
    max = len(chars) ** size - 1
    start = 0
    choices = []
    for i in range(0,count):
        start = random.randint(start, start + (max-start) // (count-i))
        digits = []
        temp = start
        while len(digits) < size:
            temp, i = divmod(temp, len(chars))
            digits.append(chars[i])
        choices.append(''.join(digits))
        start += 1
    return choices

choices = random_strings(50000)
# optional shuffle, since they are produced in order of `chars`
random.shuffle(choices)
# Test: output how many distinct values there are:
print (len(set(choices)))

repl.it

上查看它

这会在线性时间内产生字符串。使用上述参数,您可以在平均PC上获得一秒钟的答案。