2015-09-21 3 views
8

मैं पाइथन में यादृच्छिक संख्या उत्पन्न करने के तरीके के बारे में समान प्रश्न देख रहा हूं। उदाहरण: Similar Question - लेकिन मुझे समस्या नहीं है कि यादृच्छिक कार्य हर बार समान मान देता है।random.choice() एक ही दूसरे पर एक ही मूल्य देता है, इससे कोई कैसे बचता है?

मेरा यादृच्छिक जनरेटर ठीक काम करता है, समस्या यह है कि फ़ंक्शन को कॉल करते समय यह वही मान देता है, जो मुझे लगता है, वही दूसरा जो अवांछित है।

मेरे कोड इस

def getRandomID(): 
    token = '' 
    letters = "abcdefghiklmnopqrstuvwwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" 
    for i in range(1,36): 
     token = token + random.choice(letters) 
    return token 

तरह लग रहा है मैं उल्लेख किया है इस समारोह विभिन्न मूल्यों जब अलग-अलग समय पर पर बुलाया जा रहा है देता है, लेकिन एक ही मान देता है जब एक ही समय में फ़ंक्शन को कॉल। मैं इस समस्या से कैसे बचूं?

मैं डेटाबेस में डालने के लिए सामने वाले अंत में उपयोगकर्ताओं के लिए अद्वितीय आईडी उत्पन्न करने के लिए बैक-एंड-सर्वर में इस फ़ंक्शन का उपयोग करता हूं ताकि जब ऐसा होता है तो मैं समय अंतराल को नियंत्रित नहीं कर सकता। डेटाबेस में उपयोगकर्ताओं को मानचित्र में मैप करने के लिए यादृच्छिक टोकन होना चाहिए ताकि डेटाबेस में queuenumbers के साथ उन्हें सही ढंग से सम्मिलित किया जा सके।

+0

जैसे ही दो उपयोगकर्ता द्वारा एक ही समय में कॉल किया जाता है, वही आईडी लौटाता है ?? – Hackaholic

+9

मैं यादृच्छिक उपयोगकर्ता आईडी उत्पन्न करने के लिए 'uuid' का उपयोग करने का सुझाव देना चाहता हूं। – hjpotter92

+0

हैकहोलिक - बिल्कुल, यह वही "टोकन" देता है जो दो उपयोगकर्ताओं द्वारा बुलाए जाने पर यादृच्छिकता की एक ही स्ट्रिंग है। –

उत्तर

4

आप संभवतः random.SystemRandom() का उपयोग कर के रूप में निम्नानुसार द्वारा मामलों को बेहतर बना सकते:

import random 

sys_random = random.SystemRandom() 

def getRandomID(): 
    token = '' 
    letters = "abcdefghiklmnopqrstuvwwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" 
    for i in range(1,36): 
     token = token + sys_random.choice(letters) 
    return token 

print getRandomID() 

यह os.urandom() समारोह कौन सा ऑपरेटिंग सिस्टम द्वारा प्रदान स्रोतों से यादृच्छिक संख्या उत्पन्न करता है उपयोग करने के लिए प्रयास करता है।

+0

मुझे लगता है कि इस समस्या को पहली बार हल किया गया। मैं एक बड़े पैमाने पर परीक्षण करने की कोशिश करूंगा जहां मैं पुष्टि कर सकता हूं कि समाधान काम करता है! –

1
def getRandomID(n): 

    import datetime 
    import random 

    random.seed(datetime.datetime.now()) 

    letters = "abcdefghiklmnopqrstuvwwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" 

    idList = [ ''.join([random.choice(letters) for j in range(1,36)]) for i in range(n)] 

    return idList 

10 दस लाख आईडी की 3 की परीक्षा में इस स्क्रिप्ट फिर उन्हें बना दिया है सभी अद्वितीय

समझ सूची पाश के लिए बदल रहा है काफ़ी speedup था।

>>> listt = getRandomID(10000000) 
>>> print(len(listt)) 
10000000 

>>> sofIds = set(listt) 
>>> print(len(sofIds)) 
10000000 

इस स्क्रिप्ट दोहराव के साथ क्रमपरिवर्तन का उपयोग करता है: 62 36 चुनते हैं, आईडी का सैद्धांतिक रूप से यह कुल संख्या पॉव है काफी बड़ा है (62,36)

59720078628458064562952815512525677808980550940333281573339136 
+0

कृपया अपना कोड संपादित करने के बारे में और स्पष्टीकरण जोड़ने के लिए अपनी पोस्ट को संपादित करने पर विचार करें और यह समस्या का समाधान क्यों करेगा। एक उत्तर जिसमें ज्यादातर कोड शामिल होते हैं (भले ही यह काम कर रहा हो) आमतौर पर ओपी को उनकी समस्या को समझने में मदद नहीं करेगा। जो मैं देख सकता हूं, यह अनावश्यक है हालांकि यह वही है (मुझे विश्वास है) पायथन आमतौर पर इसके बीज के आधार के रूप में उपयोग करता है। और यहां तक ​​कि यदि यह नहीं है, तो यह एक ही समय में एक ही बीज प्रदान करेगा, जिसके परिणामस्वरूप एक ही आउटपुट होगा। – SuperBiasedMan

+0

आप यादृच्छिक संख्या उत्पन्न करने वाले दिनचर्या से 'random.seed' को कॉल नहीं करना चाहते हैं। आप (कभी-कभी, गैर-निर्धारितीत्मक रूप से) उसी कॉल के साथ समाप्त हो जाएंगे, जो बाद के कॉल पर 'डेटाटाइम.ओएन' से वापस आ रहा है, जो समान अनुक्रमों को वापस करने के लिए' random.choice' का कारण बन जाएगा। –

1

एक अन्य विकल्प अद्यतन करने के लिए किया जाएगा एक छद्म यादृच्छिक अनुक्रम प्राप्त करने के लिए पिछले परिणाम के साथ बीज। एक विकल्प old_seed XOR परिणाम या केवल परिणाम होगा।

संबंधित मुद्दे