पायथन में बेतरतीब तार


96

आप पायथन में एक यादृच्छिक स्ट्रिंग कैसे बनाते हैं?

मुझे इसकी आवश्यकता थी कि आप तब तक चरित्र दोहराएं जब तक कि यह वही न हो जाए जो मैंने बनाया है

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

अधिक विशिष्ट बनें, जो आप देख रहे हैं उसके कुछ उदाहरण दें।
— शरबत

जवाबों:


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), यद्यपि।
— हांक गे

1
ध्यान दें कि यद्यपि यह एक बहुत अच्छा उत्तर है, ओपी ने इसे अमान्य करने के लिए प्रश्न को संशोधित किया है। और अपना जवाब देने के लिए।
— ब्लेयर कॉनरैड

29
पायथन 3 संगतता के लिए, उपयोग करेंstring.ascii_lowercase
— dogwynn 19

@BlairConrad: मैं कहूंगा कि प्रश्न बहुत व्यापक था, जैसे मूल प्रश्न काos.urandom(length) उत्तर और @sth ने ओपी के दिमाग को गलत तरीके से पढ़ा था।
— jfs

2
पायथन 3.6 से, random.choicesतेज होगा।
— इयन्स

58

चूंकि यह प्रश्न काफी उह, यादृच्छिक है, यह आपके लिए काम कर सकता है:

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

6
कई मामलों में, यादृच्छिक की वास्तव में आवश्यकता नहीं होती है। बल्कि, आप सभी की जरूरत है अद्वितीय है।
— चेस सीबेरट

1
str(uuid.uuid4())यदि आप इसे एक स्ट्रिंग के रूप में उपयोग करना चाहते हैं, तो आप इसका उपयोग कर सकते हैं ।
— स्वगतिका

2
str(uuid.uuid4()).split("-")[0]आउटपुट:'4bcb6450'
— व्लाद गुलिन

अच्छी बात है, व्लादिमीर। कुछ समय के लिए, '' .join (str (uuid.uuid4 ()) विभाजन। ('-') भी काम करता है। आउटपुट: '00db8a458c71415c9a263ff08667dd93'
— ब्रैंडन

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

साफ! मैं वास्तव में अब एक यादृच्छिक पासवर्ड जनरेटर के लिए इसका उपयोग कर रहा हूं! धन्यवाद!
— चांडीसी

13
random.sample एस से अद्वितीय वर्णों का नमूना देगा, अर्थात पासवर्ड में वर्ण कभी भी दोहराए नहीं जाएंगे। यह स्वीकार्य उत्तर के रूप में random.choice का उपयोग करने की तुलना में काफी कम सुरक्षित है।
— निक ज़ालुत्सिकी

3
@NickZalutskiy: random.choiceभी सुरक्षित नहीं है। सीधे उपयोग random.SystemRandom().choice()या उपयोग os.urandom()करें ।
— JFS

1
चेतावनी! ऊपर दो टिप्पणियों पर ध्यान दें। random.sample अद्वितीय नमूने देता है। पात्रों को दोहराया नहीं जाता है। इसलिए लौटा स्ट्रिंग कम यादृच्छिक है। बड़ी स्ट्रिंग त्रुटि के लिए: 'ValueError: जनसंख्या से बड़ा नमूना।'
— गौइथे

1
अजगर 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)))
— क्रिस लुत्ज़

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 आप अपने रिटर्न स्टेटमेंट में पार्न्स के सबसे बाहरी सेट को छोड़ सकते हैं।
— पुनरावर्ती

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-अक्षर शब्दों से बचने के लिए, 4 पर सेट न करें length।

जिम


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

यह फ़ंक्शन यादृच्छिक स्ट्रिंग उत्पन्न करता है जिसमें ऊपरी, निचले अक्षर, अंक शामिल होते हैं, जो आपके स्ट्रिंग प्रारूप को निर्दिष्ट करने के लिए लंबाई seperator, 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

यादृच्छिक आयात से नीचे के पैकेज को आयात करने की कोशिश करें *


यह प्रश्न को बिल्कुल भी संबोधित नहीं करता है। क्या इस पैटर्न को बेतरतीब ढंग से उत्पन्न करने का एक बेहतर (पाइथोनिक) तरीका है
— drekbour
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.