Zufällige Zeichenfolgen in Python

94

Wie erstellt man eine zufällige Zeichenfolge in Python?

Ich brauchte es, um eine Zahl zu sein und dann die Zeichen zu wiederholen, bis du fertig bist. Das habe ich erstellt

def random_id(length):
    number = '0123456789'
    alpha = 'abcdefghijklmnopqrstuvwxyz'
    id = ''
    for i in range(0,length,2):
        id += random.choice(number)
        id += random.choice(alpha)
    return id
RHicke
quelle
Seien Sie genauer, geben Sie einige Beispiele für das, was Sie suchen.
Sberry
Mögliches Duplikat von zufälligen Zeichenfolgen in Python 2.6 (Ist das in Ordnung?)
Mechanische Schnecke

Antworten:

220

Generieren von Zeichenfolgen aus (zum Beispiel) Kleinbuchstaben:

import random, string

def randomword(length):
   letters = string.ascii_lowercase
   return ''.join(random.choice(letters) for i in range(length))

Ergebnisse:

>>> randomword(10)
'vxnxikmhdc'
>>> randomword(10)
'ytqhdohksy'
etw
quelle
3
Beste Antwort bisher. Ich würde randomword(length, source_alpha=string.lowercase)und verwenden xrange(length).
Hank Gay
1
Beachten Sie, dass das OP die Frage geändert hat, um sie ungültig zu machen, obwohl dies eine sehr gute Antwort ist. Und um seine / ihre eigene Antwort zu geben.
Blair Conrad
29
Verwenden string.ascii_lowercase
Sie
@BlairConrad: Ich würde sagen, die Frage war zu weit gefasst, z. B. os.urandom(length)beantwortet die ursprüngliche Frage und @sth hatte die Gedanken von OP falsch gelesen.
JFS
Wenn Sie randomword () häufiger aufrufen, wird dies viel CPU verschwenden.
Dothebart
57

Da diese Frage ziemlich zufällig ist, kann dies für Sie funktionieren:

>>> import uuid
>>> print uuid.uuid4()
58fe9784-f60a-42bc-aa94-eb8f1a7e5c17
Brandon
quelle
6
In vielen Fällen ist Zufall nicht wirklich erforderlich. Vielmehr ist alles, was Sie wirklich brauchen, einzigartig.
Chase Seibert
1
Sie können verwenden, str(uuid.uuid4())wenn Sie es als Zeichenfolge verwenden möchten.
Swagatika
2
str(uuid.uuid4()).split("-")[0]Ausgabe:'4bcb6450'
Vlad Gulin
Guter Punkt, Vlad. Für etwas länger funktioniert auch '' .join (str (uuid.uuid4 ()). Split ('-')). Ausgabe: '00db8a458c71415c9a263ff08667dd93'
Brandon
35
>>> import random
>>> import string
>>> s=string.lowercase+string.digits
>>> ''.join(random.sample(s,10))
'jw72qidagk
Ghostdog74
quelle
Ordentlich! Ich benutze dies jetzt tatsächlich für einen Zufallspasswortgenerator! Vielen Dank!
Chandsie
13
random.sample tastet eindeutige Zeichen aus s ab, dh Zeichen im Kennwort werden niemals wiederholt. Dies ist erheblich weniger sicher als die Verwendung von random.choice wie in der akzeptierten Antwort.
Nick Zalutskiy
3
@ NickZalutskiy: random.choiceist auch nicht sicher. Verwendung random.SystemRandom().choice()oder benutzen os.urandom()direkt .
JFS
1
WARNUNG! Beachten Sie zwei Kommentare oben. random.sample gibt eindeutige Samples zurück. Zeichen werden nicht wiederholt. Daher ist die zurückgegebene Zeichenfolge weniger zufällig. Bei größeren Zeichenfolgen Fehler: 'ValueError: Stichprobe größer als Grundgesamtheit'.
Gaoithe
1
In Python 3 lowercasesollte durchascii_lowercase
Attaque
18

Antwort auf die ursprüngliche Frage:

os.urandom(n)

Zitat aus: http://docs.python.org/2/library/os.html

Gibt eine Zeichenfolge von n zufälligen Bytes zurück, die für die kryptografische Verwendung geeignet sind.

Diese Funktion gibt zufällige Bytes von einer betriebssystemspezifischen Zufallsquelle zurück. Die zurückgegebenen Daten sollten für kryptografische Anwendungen nicht vorhersehbar genug sein, obwohl ihre genaue Qualität von der Implementierung des Betriebssystems abhängt. Auf einem UNIX-ähnlichen System wird / dev / urandom abgefragt, und unter Windows wird CryptGenRandom verwendet. Wenn keine Zufallsquelle gefunden wird, wird NotImplementedError ausgelöst.

Eine benutzerfreundliche Oberfläche zum Zufallszahlengenerator Ihrer Plattform finden Sie unter random.SystemRandom.

Tom
quelle
5

Sie können zufällige ASCII-Zeichen erstellen wie:

import random
print chr(random.randint(0,255))

Und dann bauen Sie eine längere Zeichenfolge auf wie:

len = 50
print ''.join( [chr(random.randint(0,255)) for i in xrange(0,len)] )
Ross Rogers
quelle
1
Warum String-Formatierung verwenden? ''.join(map(chr, random.randint(0,256) for _ in xrange(len)))
Chris Lutz
5

Sie haben nicht wirklich viel darüber gesagt, welche Art von zufälliger Zeichenfolge Sie benötigen. In jedem Fall sollten Sie sich das randomModul ansehen .

Eine sehr einfache Lösung wird unten eingefügt.

import random

def randstring(length=10):
    valid_letters='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    return ''.join((random.choice(valid_letters) for i in xrange(length)))

print randstring()
print randstring(20)
MAK
quelle
Zu Ihrer Information können Sie den äußersten Satz von Parens in Ihrer Rückgabeerklärung weglassen.
rekursiv
4

Manchmal wollte ich zufällige Zeichenfolgen, die halb aussprechbar und halb einprägsam sind.

import random

def randomWord(length=5):
    consonants="bcdfghjklmnpqrstvwxyz"
    vowels="aeiou"

    return "".join(random.choice((consonants,vowels)[i%2]) for i in range(length))

Dann,

>>> randomWord()
nibit
>>> randomWord()
piber
>>> randomWord(10)
rubirikiro

Um 4-Buchstaben-Wörter zu vermeiden, setzen Sie nicht lengthauf 4.

Jim

Jim
quelle
3
random_name = lambda length: ''.join(random.sample(string.letters, length))

Länge muss <= len (string.letters) = 53 sein. Ergebnisbeispiel

   >>> [random_name(x) for x in range(1,20)]
['V', 'Rq', 'YtL', 'AmUF', 'loFdS', 'eNpRFy', 'iWFGtDz', 'ZTNgCvLA', 'fjUDXJvMP', 'EBrPcYKUvZ', 'GmxPKCnbfih', 'nSiNmCRktdWZ', 'VWKSsGwlBeXUr', 'i
stIFGTUlZqnav', 'bqfwgBhyTJMUEzF', 'VLXlPiQnhptZyoHq', 'BXWATvwLCUcVesFfk', 'jLngHmTBtoOSsQlezV', 'JOUhklIwDBMFzrTCPub']
>>> 

Genießen. ;)

Spouk
quelle
0

Diese Funktion generiert eine zufällige Zeichenfolge, die aus Groß- und Kleinbuchstaben und Ziffern besteht. Übergeben Sie den Längenseperator no_of_blocks, um Ihr Zeichenfolgenformat anzugeben

Beispiel: len_sep = 4, no_of_blocks = 4 erzeugt das folgende Muster:

F4nQ-Vh5z-JKEC-WhuS

Wobei der Längenseperator nach 4 Zeichen "-" hinzufügt

XXXX-

Keiner der Blöcke generiert das folgende Zeichenmuster als Zeichenfolge

XXXX - XXXX - XXXX - XXXX

Wenn eine einzelne zufällige Zeichenfolge benötigt wird, lassen Sie einfach die Variable no_of_blocks gleich 1 und len_sep, um die Länge der zufälligen Zeichenfolge anzugeben.

Beispiel: len_sep = 10, no_of_blocks = 1, erzeugt das folgende Muster, dh. zufällige Zeichenfolge der Länge 10 ,

F01xgCdoDU

import random as r

def generate_random_string(len_sep, no_of_blocks):
    random_string = ''
    random_str_seq = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    for i in range(0,len_sep*no_of_blocks):
        if i % len_sep == 0 and i != 0:
            random_string += '-'
        random_string += str(random_str_seq[r.randint(0, len(random_str_seq) - 1)])
    return random_string
Manoj Selvin
quelle
0
import random 
import string

def get_random_string(size):
    chars = string.ascii_lowercase+string.ascii_uppercase+string.digits
    ''.join(random.choice(chars) for _ in range(size))

print(get_random_string(20)

Ausgabe: FfxjmkyyLG5HvLeRudDS

Rakesh Babu
quelle