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

Seien Sie genauer, geben Sie einige Beispiele für das, was Sie suchen.
Sberry

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'

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

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

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.


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

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)

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


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



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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.