2016-10-18 1 views
2

Ich habe eine Methode, die 50.000 zufällige Zeichenfolgen generiert, speichern Sie sie alle in eine Datei, und durchlaufen Sie dann die Datei, und löschen Sie alle Duplikate der Zeichenfolgen, die auftreten. Von diesen 50.000 zufälligen Strings bleiben nach der Verwendung von set() zur Erzeugung von eindeutigen Strings durchschnittlich 63 übrig.Generieren Sie eine Menge von zufälligen Zeichenfolgen

Funktion die Saiten erzeugen:

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

löschen Duplikate:

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)) 

Beispiel vor und nach: https://gist.github.com/Ekultek/a760912b40cb32de5f5b3d2fc580b99f

Wie kann ich ohne Duplikate völlig zufällig eindeutige Zeichenfolgen generieren?

+0

Benötigen Sie 2 Dateien oder möchten Sie nur 50000 eindeutige Zeichenfolgen? –

+0

Was soll 'set (data)' tun? – thebjorn

+0

@SimonBlack 50k einzigartige Stiche – Pyth0nicPenguin

Antwort

3

Sie gesetzt von Anfang an verwenden können

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

Und einmal außerhalb der Schleife speichern

+0

Würde dies nicht verlangsamen diesen Prozess eine ganze Menge? – Pyth0nicPenguin

+0

@ PythonicPenguin, weniger als Dateien neu schreiben. Und wenn Sie doppelte entfernen, nachdem Sie 50k Wörter erstellt haben - Sie erhalten weniger Wörter. – volcano

+0

BTW, wenn Sie sich sorgen ab.Execution Zeit - Sie sollten wahrscheinlich nicht alle 50k Kombinationen protokollieren. – volcano

0

Sie einzigartige Saiten durch Erzeugen eindeutige Zahlen garantieren könnte, mit einer Zufallszahl beginnt, ist ein Bereich, der ist 1/50000 th der Gesamtzahl der Möglichkeiten (62). Erzeugen Sie dann mehr Zufallszahlen und bestimmen Sie jedes Mal das Fenster, in dem die nächste Nummer ausgewählt werden kann. Das ist nicht perfekt zufällig, aber ich glaube, es ist praktisch nahe genug.

Dann können diese Zahlen jeweils in Zeichenketten konvertiert werden, indem eine Darstellung einer 62-Basen-Zahl berücksichtigt wird. Hier ist der Code, und ein Test am Ende zu überprüfen, ob tatsächlich alle 50000 Strings sind einzigartig:

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))) 

anzeigen laufen auf repl.it

Dies erzeugt die Saiten in linearer Zeit. Mit den oben genannten Parametern haben Sie die Antwort innerhalb einer Sekunde auf dem durchschnittlichen PC.

Verwandte Themen