2012-05-19 20 views
26

मैंने Python Docs पर देखा (मुझे गलत समझा जा सकता है), लेकिन मैंने नहीं देखा कि एक पुनरावर्ती कार्य को कॉल किए बिना ऐसा करने का कोई तरीका था (नीचे देखें)।
मैं जो करना चाहता हूं वह एक यादृच्छिक मान उत्पन्न करता है जिसमें मध्य में मान शामिल नहीं होते हैं।क्या पाइथन एक यादृच्छिक संख्या उत्पन्न कर सकता है जिसमें रिकर्सन का उपयोग किए बिना संख्याओं का एक सेट शामिल नहीं है?

दूसरे शब्दों में,
की कल्पना मैं X एक यादृच्छिक संख्या कि
range(a - b, a + b)
में नहीं है मैं पहली बार पास पर यह कर सकता बनना चाहता था चलो,
या
1. मैं लगातार उत्पन्न करने के लिए है एक संख्या,
2. जांचें कि range(),
3. कुल्ला धोएं?

कारण है कि मैं एक पुनरावर्ती समारोह लिखने के लिए इच्छा नहीं है का सवाल है,
1. यह लगता है जैसे 'मैं
2. करने के लिए संख्या के लिए मैं यह कर रहा हूँ वास्तव में लग सकती है के सेट नहीं होना चाहिए काफी बड़ा है, और
... मुझे लगता है कि स्टैक ओवरफ्लो खराब हैं, और मैं बस ऐसा करने में अत्यधिक सावधानी बरत रहा हूं।

मुझे यकीन है कि ऐसा करने के लिए एक अच्छा, पायथनिक, गैर-पुनरावर्ती तरीका है।

उत्तर

25

random.choice उपयोग()। इस उदाहरण में, आपकी निचली बाध्यता है, बी और सी के बीच की सीमा छोड़ी गई है और डी आपकी ऊपरी सीमा है।

import random 
numbers = range(a,b) + range(c,d) 
r = random.choice(numbers) 
+12

यह तब तक काम करेगा जब तक कि संभावित उत्तरों का सेट बेहद बड़ा न हो, इस स्थिति में यह बहुत अधिक स्मृति और क्रैश का उपयोग करेगा। –

+0

@AndrewG: सहमत है, यदि आपके पास लाखों/अरबों का आकार है तो यह आदर्श नहीं है। दूसरी ओर, यह सरल और यादगार है। आपका जवाब, जबकि एक बहुत अच्छा और मजबूत समाधान, अधिक त्रुटि-प्रवण हो सकता है। – Junuxx

+1

हाँ। अगर आपके, ए, बी, सी और डी को शुरुआत से जाना जाता था और एक छोटा सेट होने के लिए जाना जाता था, तो मेरा जवाब उपयोग होता था, और मेरा अगर वे इनपुट पर निर्भर थे या बड़े सेट के रूप में जाने जाते थे। –

4

सबसे तेजी से समाधान (ए और बी बहिष्कार क्षेत्र और ग को परिभाषित करने और बहिष्कार क्षेत्र सहित अच्छा जवाब के सेट d के साथ) इस होगा:

offset = b - a 
maximum = d - offset 
result = random.randrange(c, maximum) 
if result >= a: 
    result += offset 
+0

हम्म, वहाँ कोड की है कि पिछले अनुभाग में एक तर्क त्रुटि होना चाहिए - अब यह डिबग करने के लिए कोशिश कर रहा –

+0

... ओह। यह ऑफसेट = बी - ए होना चाहिए। संपादन। –

+0

और यह भी परिणाम होना चाहिए> = ए। वहां, यह करना चाहिए। –

6

मैं आपकी समस्या को गलत समझा है, लेकिन आप हालांकि प्रत्यावर्तन

def rand(exclude): 
    r = None 
    while r in exclude or r is None: 
     r = random.randrange(1,10) 
    return r 

rand([1,3,9]) 

के बिना इस लागू कर सकते हैं, आप अभी भी परिणामों पर पाशन कर रहे हैं जब तक आप नए लोगों को लगता है।

0

आपको अभी भी कुछ रेंज की आवश्यकता है, यानी, आपके मध्य मूल्यों को छोड़कर न्यूनतम-न्यूनतम संभव मूल्य।

आप पहली बार यादृच्छिक रूप से उस सीमा का "आधा" क्यों नहीं चुनते हैं, फिर उस सीमा में एक यादृच्छिक संख्या चुनें? उदा .:

def rand_not_in_range(a,b): 
    rangechoices = ((0,a-b-1),(a+b+1, 10000000)) 
    # Pick a half 
    fromrange = random.choice(rangechoices) 
    # return int from that range 
    return random.randint(*fromrange) 
+2

यह दो श्रेणियों के बीच 50/50 वितरण प्राप्त करेगा, भले ही वे एक दूसरे के सापेक्ष कितने बड़े हों। अच्छी व्याख्या के लिए –

9

एक संभावित समाधान केवल उस सीमा से यादृच्छिक संख्याओं को स्थानांतरित करना होगा। जैसे

def NormalWORange(a, b, sigma): 
    r = random.normalvariate(a,sigma) 
    if r < a: 
     return r-b 
    else: 
     return r+b 

इससे सीमा में एक छेद (ए-बी, ए + बी) के साथ सामान्य वितरण उत्पन्न होगा।

संपादित करें: यदि आप पूर्णांक चाहते हैं तो आपको थोड़ा और काम करने की आवश्यकता होगी। यदि आप रेंज [सी, ए-बी] या [ए + बी, डी] में पूर्णांक चाहते हैं तो निम्नलिखित को चाल चलनी चाहिए।

def RangeWORange(a, b, c, d): 
    r = random.randrange(c,d-2*b) # 2*b because two intervals of length b to exclude 
    if r >= a-b: 
     return r+2*b 
    else: 
     return r 
40

एक यादृच्छिक संख्या उत्पन्न करें और इसे अपनी इच्छित श्रेणीओं पर मानचित्र बनाएं।

आप 1-4 या 7-10, 5 और 6 को छोड़कर बीच का एक पूर्णांक उत्पन्न करने के लिए चाहता था, तो आप हो सकता है:

  1. रेंज 1-8
  2. में एक यादृच्छिक पूर्णांक उत्पन्न यादृच्छिक संख्या 4 से अधिक है, तो परिणाम के लिए 2 जोड़ें।

मानचित्रण हो जाता है:

Random number: 1 2 3 4 5 6 7 8 
Result:   1 2 3 4 7 8 9 10 

यह इस तरह से कर रहा है, तो आप "फिर से रोल" की जरूरत कभी नहीं। उपर्युक्त उदाहरण पूर्णांक के लिए है, लेकिन इसे फ्लोट पर भी लागू किया जा सकता है।

+0

+1 - यह वही है जो मैं प्राप्त कर रहा था लेकिन मुझे बस कोड के साथ व्याख्या करने के लिए अस्पष्ट पाया गया। –

+3

@AndrewG। : धन्यवाद। :) इसे कुछ चित्रों के साथ भी बेहतर समझाया जा सकता है, लेकिन मेरे लिए Visio खोलने के लिए सक्रियण ऊर्जा आज रात थोड़ा अधिक है। ;) –

+0

इसके लिए आपको बहुत बहुत धन्यवाद, यह इसके निष्पादन में बहुत सीधी है और पाठक को कोड को पोस्ट करने और कहने के विपरीत स्पष्ट उत्तर खींचने के लिए प्रेरित करता है, "यहां, इसे चलाएं।" अंत में मैं जुनक्सक्स के समाधान के साथ गया, लेकिन मैं इस जवाब के लालित्य की भी सराहना करता हूं। –

0

ली-ऑंग यिप का जवाब रिकर्सन मुद्दा जारी करता है, लेकिन मुझे यह इंगित करना है कि स्टैक के बारे में चिंता किए बिना किसी भी डिग्री की रिकॉर्शन करना संभव है। इसे "पूंछ रिकर्सन" कहा जाता है। अजगर पूंछ प्रत्यावर्तन सीधे समर्थन नहीं करता, क्योंकि gvr सोचता है कि यह uncool है:

http://neopythonic.blogspot.com/2009/04/tail-recursion-elimination.html

लेकिन आप इस के आसपास मिल सकती है:

http://paulbutler.org/archives/tail-recursion-in-python/

मैं छड़ी सोचता है कि यह दिलचस्प है कि उस प्रत्यावर्तन "लगता है गलत लगता है "। अत्यंत कार्य-उन्मुख भाषाओं में, जैसे योजना, रिकर्सन अपरिहार्य है। यह आपको राज्य चर बनाने के बिना पुनरावृत्ति करने की अनुमति देता है, जो कार्यात्मक प्रोग्रामिंग प्रतिमान कठोर रूप से टालता है।

http://www.pling.org.uk/cs/pop.html

+0

किसी ऐसे व्यक्ति के रूप में जो प्रोग्रामिंग के लिए नया है, यह पूरी तरह से सामान है जिसे मुझे पढ़ने की आवश्यकता है। धन्यवाद!मैं अनिवार्य रूप से एलर्जी से रिकर्सन नहीं कर रहा हूं, और सच्चाई बताने के लिए मुझे एहसास नहीं हुआ कि पाइथन के बीडीएफएल ने भी सामान्य रूप से इसके लिए अपमान दिखाया है; मुझे बस एक आंत महसूस हुआ कि मुझे इस विशेष परियोजना के लिए इसका उपयोग करने की आवश्यकता नहीं है। मैं भविष्य के प्रयासों के लिए इसे रद्द नहीं करूँगा। –

+0

अरे, अगर मेरा जवाब उपयोगी था, तो कृपया इसे वोट दें! मुझे प्रतिष्ठा की ज़रूरत है। –

+0

मैंने सोचा कि मेरे पास था। मेरी गलती :) –

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

  • कोई संबंधित समस्या नहीं^_^