สตริงสุ่มใน Python


96

คุณสร้างสตริงแบบสุ่มใน Python ได้อย่างไร?

ฉันต้องการให้เป็นตัวเลขจากนั้นให้อักขระซ้ำจนกว่าคุณจะทำเสร็จนี่คือสิ่งที่ฉันสร้างขึ้น

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

เจาะจงมากขึ้นยกตัวอย่างสิ่งที่คุณกำลังมองหา
sberry

คำตอบ:


224

การสร้างสตริงจาก (เช่น) อักขระตัวพิมพ์เล็ก:

import random, string

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

ผล:

>>> randomword(10)
'vxnxikmhdc'
>>> randomword(10)
'ytqhdohksy'

3
คำตอบที่ดีที่สุดจนถึงตอนนี้ ฉันจะใช้randomword(length, source_alpha=string.lowercase)และxrange(length)แม้ว่า
Hank Gay

1
โปรดทราบว่าแม้ว่านี่จะเป็นคำตอบที่ดีมาก แต่ OP ได้แก้ไขคำถามให้เป็นโมฆะ และให้คำตอบของตนเอง
Blair Conrad

29
สำหรับความเข้ากันได้ของ Python 3 ให้ใช้string.ascii_lowercase
dogwynn

@BlairConrad: ฉันจะบอกว่าคำถามกว้างเกินไปเช่นos.urandom(length)ตอบคำถามเดิมและ @sth อ่านใจของ OP ไม่ถูกต้อง
jfs

2
จาก Python 3.6 random.choicesจะเร็วกว่า
IanS

60

เนื่องจากคำถามนี้ค่อนข้างเป็นธรรมเอ่อสุ่มสิ่งนี้อาจใช้ได้กับคุณ:

>>> import uuid
>>> print uuid.uuid4()
58fe9784-f60a-42bc-aa94-eb8f1a7e5c17

6
ในหลาย ๆ กรณีการสุ่มไม่จำเป็นจริงๆ แต่สิ่งที่คุณต้องการจริงๆคือไม่เหมือนใคร
Chase Seibert

1
คุณสามารถใช้str(uuid.uuid4())ถ้าคุณต้องการใช้เป็นสตริง
Swagatika

2
str(uuid.uuid4()).split("-")[0]Output:'4bcb6450'
Vlad Gulin

จุดดีวลาด สำหรับบางสิ่งที่ยาวขึ้น ".join (str (uuid.uuid4 ()). split ('-')) ก็ใช้ได้เช่นกัน เอาต์พุต: '00db8a458c71415c9a263ff08667dd93'
Brandon

36
>>> import random
>>> import string
>>> s=string.lowercase+string.digits
>>> ''.join(random.sample(s,10))
'jw72qidagk

เรียบร้อย! ตอนนี้ฉันกำลังใช้สิ่งนี้เพื่อสร้างรหัสผ่านแบบสุ่ม! ขอบคุณ!
chandsie

13
random.sample จะสุ่มตัวอย่างอักขระที่ไม่ซ้ำกันจาก s กล่าวคืออักขระในรหัสผ่านจะไม่ซ้ำ สิ่งนี้มีความปลอดภัยน้อยกว่าการใช้ random.choice อย่างมากเช่นเดียวกับคำตอบที่ยอมรับ
Nick Zalutskiy

3
@NickZalutskiy: random.choiceไม่ปลอดภัยเช่นกัน ใช้random.SystemRandom().choice()หรือใช้os.urandom()โดยตรง .
jfs

1
คำเตือน! จดสองความคิดเห็นด้านบน random.sample ส่งคืนตัวอย่างที่ไม่ซ้ำกัน อักขระไม่ซ้ำ สตริงที่ส่งคืนจึงสุ่มน้อยกว่า สำหรับข้อผิดพลาดสตริงที่ใหญ่กว่า: 'ValueError: ตัวอย่างมากกว่าจำนวนประชากร'
gaoithe

1
ใน Python 3 lowercaseควรแทนที่ด้วยascii_lowercase
Attaque

18

ตอบคำถามเดิม:

os.urandom(n)

อ้างจาก: http://docs.python.org/2/library/os.html

ส่งคืนสตริงของ n ไบต์แบบสุ่มที่เหมาะสำหรับการใช้การเข้ารหัส

ฟังก์ชันนี้จะส่งคืนไบต์แบบสุ่มจากแหล่งที่มาของการสุ่มเฉพาะ OS ข้อมูลที่ส่งคืนควรไม่สามารถคาดเดาได้เพียงพอสำหรับแอปพลิเคชันการเข้ารหัสแม้ว่าคุณภาพที่แน่นอนจะขึ้นอยู่กับการใช้งานระบบปฏิบัติการ ในระบบที่เหมือน UNIX สิ่งนี้จะค้นหา / dev / urandom และบน Windows จะใช้ CryptGenRandom หากไม่พบแหล่งที่มาของการสุ่ม NotImplementedError จะถูกยกขึ้น

สำหรับอินเทอร์เฟซที่ใช้งานง่ายของตัวสร้างตัวเลขสุ่มที่แพลตฟอร์มของคุณมีให้โปรดดู random.SystemRandom


5

คุณสามารถสร้างตัวละคร ascii แบบสุ่มเช่น:

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

จากนั้นสร้างสตริงที่ยาวขึ้นเช่น:

len = 50
print ''.join( [chr(random.randint(0,255)) for i in xrange(0,len)] )

1
เหตุใดจึงใช้การจัดรูปแบบสตริง ''.join(map(chr, random.randint(0,256) for _ in xrange(len)))
Chris Lutz

5

คุณยังไม่ได้พูดอะไรมากเกี่ยวกับสตริงสุ่มที่คุณต้องการ แต่ไม่ว่าในกรณีใดคุณควรตรวจสอบrandomโมดูล

วิธีง่ายๆวางอยู่ด้านล่าง

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)

fyi คุณสามารถละเว้นชุด parens ด้านนอกสุดในคำสั่ง return
เวียนซ้ำ

4

บางครั้งฉันต้องการสตริงสุ่มที่กึ่งออกเสียงกึ่งน่าจดจำ

import random

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

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

จากนั้น

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

เพื่อหลีกเลี่ยงคำ 4 ตัวอักษรอย่าตั้งค่าlengthเป็น 4

จิม


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

ความยาวต้อง <= len (string.letters) = 53 ตัวอย่างผลลัพธ์

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

สนุก. ;)



1

ในpython3.6+คุณสามารถใช้secretsโมดูล :

โมดูลความลับใช้สำหรับการสร้างตัวเลขสุ่มที่คาดเดายากซึ่งเหมาะสำหรับการจัดการข้อมูลเช่นรหัสผ่านการตรวจสอบบัญชีโทเค็นความปลอดภัยและความลับที่เกี่ยวข้อง

โดยเฉพาะอย่างยิ่งควรใช้ความลับตามความต้องการของตัวสร้างตัวเลขสุ่มหลอกเริ่มต้นในโมดูลสุ่มซึ่งออกแบบมาสำหรับการสร้างแบบจำลองและการจำลองไม่ใช่การรักษาความปลอดภัยหรือการเข้ารหัส

ในการทดสอบการสร้าง768bitโทเค็นความปลอดภัยฉันพบ:

  • random.choices()- 0.000246วินาที
  • secrets.choice()- 0.003529วินาที

secretsโมดูลจะช้า แต่อยู่นอกของการทดสอบมันเป็นสิ่งที่คุณควรจะใช้เพื่อวัตถุประสงค์ในการเข้ารหัสลับ:

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

0

ฟังก์ชันนี้สร้างสตริงแบบสุ่มซึ่งประกอบด้วยตัวอักษรตัวพิมพ์ใหญ่ตัวพิมพ์เล็กตัวเลขส่งผ่านตัวแยกความยาว no_of_blocks เพื่อระบุรูปแบบสตริงของคุณ

เช่น: len_sep = 4, no_of_blocks = 4 จะสร้างรูปแบบต่อไปนี้

F4nQ-Vh5z-JKEC-WhuS

โดยที่ตัวคั่นความยาวจะเพิ่ม "-" หลัง 4 อักขระ

XXXX-

ไม่มีบล็อกใดที่จะสร้างอักขระต่อไปนี้เป็นสตริง

XXXX - XXXX - XXXX - XXXX

หากต้องการสตริงสุ่มเดี่ยวเพียงแค่เก็บตัวแปร no_of_blocks ให้เท่ากับ 1 และ len_sep เพื่อระบุความยาวของสตริงสุ่ม

เช่น: len_sep = 10, no_of_blocks = 1 จะสร้างรูปแบบต่อไปนี้คือ สตริงแบบสุ่มของความยาว 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)

เอาต์พุต: FfxjmkyyLG5HvLeRudDS


-1

ลองนำเข้าแพ็คเกจด้านล่างจากการนำเข้าแบบสุ่ม *


สิ่งนี้ไม่ได้ตอบคำถามเลย มีวิธีที่ดีกว่า (pythonic) ในการสร้างรูปแบบนี้แบบสุ่ม
drekbour
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.