String acak dengan Python

96

Bagaimana Anda membuat string acak dengan Python?

Saya membutuhkannya menjadi angka kemudian karakter ulangi sampai Anda selesai ini adalah apa yang saya buat

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
sumber
Lebih spesifik, berikan beberapa contoh apa yang Anda cari.
sberry
kemungkinan duplikat string Acak dengan Python 2.6 (Apakah ini OK?)
Siput mekanik

Jawaban:

224

Menghasilkan string dari (misalnya) karakter huruf kecil:

import random, string

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

Hasil:

>>> randomword(10)
'vxnxikmhdc'
>>> randomword(10)
'ytqhdohksy'
sth
sumber
3
Jawaban terbaik sejauh ini. Saya akan menggunakan randomword(length, source_alpha=string.lowercase)dan xrange(length), meskipun.
Hank Gay
1
Perhatikan bahwa meskipun ini adalah jawaban yang sangat bagus, OP telah memodifikasi pertanyaan untuk membuatnya tidak valid. Dan untuk memberikan jawabannya sendiri.
Blair Conrad
29
Untuk kompatibilitas Python 3, gunakanstring.ascii_lowercase
dogwynn
@BlairConrad: Menurut saya pertanyaannya terlalu luas, misalnya os.urandom(length)menjawab pertanyaan asli dan @sth salah membaca pikiran OP.
jfs
2
Dari Python 3.6, random.choicesakan lebih cepat.
IanS
58

Karena pertanyaan ini cukup, eh, acak, ini mungkin berhasil untuk Anda:

>>> import uuid
>>> print uuid.uuid4()
58fe9784-f60a-42bc-aa94-eb8f1a7e5c17
Brandon
sumber
6
Dalam banyak kasus, acak tidak benar-benar diperlukan. Sebaliknya, yang Anda butuhkan hanyalah unik.
Mengejar Seibert
1
Anda bisa menggunakannya str(uuid.uuid4())jika Anda ingin menggunakannya sebagai string.
Swagatika
2
str(uuid.uuid4()).split("-")[0]Keluaran:'4bcb6450'
Vlad Gulin
Poin yang bagus, Vlad. Untuk sesuatu yang lebih lama, ".join (str (uuid.uuid4 ()). Split ('-')) juga berfungsi. Output: '00db8a458c71415c9a263ff08667dd93'
Brandon
35
>>> import random
>>> import string
>>> s=string.lowercase+string.digits
>>> ''.join(random.sample(s,10))
'jw72qidagk
anjing hantu74
sumber
Rapi! Saya sebenarnya menggunakan ini untuk generator kata sandi acak sekarang! Terima kasih!
chandsie
13
random.sample akan mengambil sampel karakter unik dari s, yaitu karakter dalam kata sandi tidak akan pernah berulang. Ini jauh kurang aman daripada penggunaan random.choice seperti pada jawaban yang diterima.
Nick Zalutskiy
3
@NickZalutskiy: random.choicejuga tidak aman. Gunakan random.SystemRandom().choice()atau gunakan os.urandom()secara langsung .
jfs
1
PERINGATAN! perhatikan dua komentar di atas. random.sample mengembalikan sampel unik. karakter tidak diulang. jadi string yang dikembalikan kurang acak. Untuk kesalahan string yang lebih besar: 'ValueError: sampel lebih besar dari populasi'.
gaoithe
1
Di Python 3, lowercaseharus diganti denganascii_lowercase
Attaque
18

Jawaban untuk pertanyaan awal:

os.urandom(n)

Kutipan dari: http://docs.python.org/2/library/os.html

Kembalikan string n byte acak yang cocok untuk penggunaan kriptografi.

Fungsi ini mengembalikan byte acak dari sumber keacakan khusus OS. Data yang dikembalikan harus cukup tidak dapat diprediksi untuk aplikasi kriptografi, meskipun kualitas pastinya bergantung pada penerapan OS. Pada sistem mirip UNIX, perintah ini akan meminta / dev / urandom, dan pada Windows akan menggunakan CryptGenRandom. Jika sumber keacakan tidak ditemukan, NotImplementedError akan dimunculkan.

Untuk antarmuka yang mudah digunakan ke generator nomor acak yang disediakan oleh platform Anda, silakan lihat random.SystemRandom.

Tom
sumber
5

Anda dapat membangun karakter ascii acak seperti:

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

Dan kemudian buat string yang lebih panjang seperti:

len = 50
print ''.join( [chr(random.randint(0,255)) for i in xrange(0,len)] )
Ross Rogers
sumber
1
Mengapa menggunakan pemformatan string? ''.join(map(chr, random.randint(0,256) for _ in xrange(len)))
Chris Lutz
5

Anda belum benar-benar mengatakan banyak tentang jenis string acak yang Anda butuhkan. Namun bagaimanapun, Anda harus melihat ke filerandom modul.

Solusi yang sangat sederhana ditempel di bawah ini.

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
sumber
Perlu diketahui, Anda dapat menghilangkan kumpulan terluar dari tanda kurung dalam pernyataan pengembalian Anda.
rekursif
4

Terkadang, saya menginginkan string acak yang semi-diucapkan, semi-mudah diingat.

import random

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

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

Kemudian,

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

Untuk menghindari kata 4 huruf, jangan setel lengthke 4.

Jim

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

panjangnya harus <= len (string.letters) = 53. contoh hasil

   >>> [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']
>>> 

Nikmati. ;)

Spouk
sumber
1

Di python3.6+Anda dapat menggunakan secretsmodul :

Modul rahasia digunakan untuk menghasilkan angka acak yang kuat secara kriptografis yang cocok untuk mengelola data seperti kata sandi, otentikasi akun, token keamanan, dan rahasia terkait.

Secara khusus, rahasia harus digunakan dalam preferensi ke generator nomor pseudo-acak default dalam modul acak, yang dirancang untuk pemodelan dan simulasi, bukan keamanan atau kriptografi.

Dalam pengujian pembuatan 768bittoken keamanan, saya menemukan:

  • random.choices()- 0.000246detik
  • secrets.choice()- 0.003529detik

The secretsmodul lebih lambat tetapi di luar dari pengujian itu adalah apa yang seharusnya Anda menggunakan untuk tujuan kriptografi:

import string, secrets

def random_string(size):        
        letters = string.ascii_lowercase+string.ascii_uppercase+string.digits            
        return ''.join(secrets.choice(letters) for i in range(size))

print(random_string(768))
Stuart Cardall
sumber
0

Fungsi ini menghasilkan string acak yang terdiri dari huruf besar, huruf kecil, angka, melewati pemisah panjang, no_of_blocks untuk menentukan format string Anda

misal: len_sep = 4, no_of_blocks = 4 akan menghasilkan pola berikut,

F4nQ-Vh5z-JKEC-WhuS

Dimana, pemisah panjang akan menambahkan "-" setelah 4 karakter

XXXX-

tidak ada blok yang akan menghasilkan pola karakter berikut sebagai string

XXXX - XXXX - XXXX - XXXX

jika satu string acak diperlukan, pertahankan variabel no_of_blocks sama dengan 1 dan len_sep untuk menentukan panjang string acak.

misal: len_sep = 10, no_of_blocks = 1, akan menghasilkan pola sebagai berikut. string acak dengan panjang 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
sumber
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)

keluaran: FfxjmkyyLG5HvLeRudDS

Rakesh babu
sumber
-1

coba impor paket di bawah ini dari impor acak *

Yash chitroda
sumber
Ini tidak menjawab pertanyaan itu sama sekali. Apakah ada cara (pythonic) yang lebih baik untuk menghasilkan pola acak ini
drekbour