2017-02-16 8 views
5

मैं अंतराल [1,n] पर दो यादृच्छिक पूर्णांक बनाना चाहता हूं जो एक-दूसरे से अलग होने की गारंटी देते हैं। मुझे लगता है किदो अलग-अलग यादृच्छिक पूर्णांक बनाने के लिए सुरुचिपूर्ण तरीका

ri(1)=randi([1 n]); 
ri(2)=randi([1 n]); 
while ri(1)==ri(2) 
    ri(2)=randi([1 n]); 
end 

वास्तव में सबसे आसान चीज नहीं है जो आप कर सकते हैं।

ri = randperm(n, 2); 

पुराने:

+2

पी = [randperm (एन, कश्मीर)] (https://www.mathworks.com/help/matlab/ref/randperm.html) एक पंक्ति वेक्टर लौटाता है जिसमें ** ** अद्वितीय ** पूर्णांक 1 से एन समावेशी से यादृच्छिक रूप से चयनित होते हैं। –

उत्तर

8

एक विधि randperm उपयोग करें ताकि आप n मानों 1 से करने के लिए और n सहित enumerated हैं की एक यादृच्छिक क्रमपरिवर्तन उत्पन्न, और केवल परिणाम के पहले दो तत्वों वापस जाने के लिए है MATLAB के संस्करण इस तरह से randperm पर कॉल करने का समर्थन नहीं करते हैं। पुराने संस्करण केवल एक इनपुट संस्करण स्वीकार करते हैं, जो डिफ़ॉल्ट रूप से n मानों का संपूर्ण क्रमपरिवर्तन देता है। इसलिए, आप randperm एक इनपुट संस्करण का उपयोग कर कॉल कर सकते हैं, तो अंतिम परिणाम में सबसेट आपको क्या चाहिए वापस जाने के लिए:

ri = randperm(n); 
ri = ri([1 2]); 
+0

बिल्कुल। 'रंडी' पर प्रलेखन से: "रंडी द्वारा लौटाए गए सरणी में बार-बार पूर्णांक मान हो सकते हैं। इसे कभी-कभी प्रतिस्थापन के साथ नमूनाकरण के रूप में जाना जाता है। अद्वितीय पूर्णांक मान प्राप्त करने के लिए, कभी-कभी प्रतिस्थापन के बिना नमूनाकरण के रूप में जाना जाता है, रैंडपर्म (रैंडस्ट्रीम) का उपयोग करें। " –

+0

@EdwardCarney हाँ मुझे पता था :) धन्यवाद। समाधान के लिए – rayryeng

+0

@rayryeng धन्यवाद। और 'रंडी' दस्तावेज की जांच न करने के लिए खेद है। मैं 'रैंड' दस्तावेज पर था जहां वे आपको 'रंडी' के बारे में बताते थे और किसी भी तरह से 'रंडी' दस्तावेज की जांच करने के बारे में नहीं सोचा था .... – Max

2

उपयोग randperm रेंज 1 में दो अनूठे मान बनाने के लिए ... n

out = randperm(n, 2) 
out(1) = number 1 
out(2) = number 2 

यदि आप अपनी सीमा में 0 शामिल करना चाहते हैं। तो:

out = randperm(n+1, 2); 
out = out-1; 
out(1) = number 1 
out(2) = number 2 
+0

@rayryeng का उपयोग करने के लिए मेरे साथ हुआ है, सच है ... मैं 'सी' दुनिया से आया हूं जहां इंडेक्स शुरू होता है 0 0 :) –

+0

@tonytannous आपके उत्तर के लिए धन्यवाद और अतिरिक्त जानकारी के लिए कुंआ। मैं पहली बार पोस्टसेट के बाद से रे के समाधान को स्वीकार करूंगा, लेकिन आपको मेरा अपवॉट मिला;) – Max

+0

@ मैक्स :) मदद करने में खुशी हुई। हां उनके जवाब ने समझाया कि दृश्यों के पीछे 'रैंडपर्म' कैसे काम करता है। मैंने बस उस भाग को छोड़ दिया: डी –

2

यहाँ एक और तरीका है:

ri(1) = randi([1 n]); % choose ri(1) uniformly from the set 1,...,n 
ri(2) = randi([1 n-1]); % choose ri(2) uniformly from 1,...,n-1 
ri(2) = ri(2) + (ri(2)>=ri(1)); % transform 1,...,n-1 into 1,...,ri(1)-1,ri(1)+1,...,n 
+0

@LuisMendo आपके दृष्टिकोण के लिए भी धन्यवाद। यह वास्तव में मेरे लिए कोई फर्क नहीं पड़ता, लेकिन गणितीय दृष्टिकोण से ये संख्याएं काफी हद तक अप्रिय नहीं होंगी, या वे? – Max

+1

@ मैक्स संख्याएं स्वतंत्र नहीं हैं। वे इस या किसी अन्य दृष्टिकोण के साथ नहीं हो सकते हैं। चूंकि आप दो संख्याओं को अलग करना चाहते हैं, इसलिए किसी को जानना आपको दूसरे के बारे में कुछ बताता है, इसलिए वे स्वतंत्र नहीं हैं। आप जो चाहते हैं (आपके कोड से निर्णय लेना) सभी जोड़ों का उत्पादन करना है यदि एक ही संभावना के साथ अलग-अलग संख्याएं हैं। और यही मेरा कोड करता है। 'N = 7' पर विचार करें। यदि 'ri (1)' उदाहरण के लिए '3' है, तो दूसरी और तीसरी पंक्तियां' 1', '2',' 4', '5',' 6' से समान रूप से 'ri (2)' चुनती हैं, '7'।मैंने –

+0

@LuisMendo हां को स्पष्ट करने के लिए कोड में कुछ टिप्पणियां जोड़ दी हैं, आप सही हैं, मेरा मतलब क्या था यदि 'ri (2) 'को उस सेट पर समान रूप से वितरित किया गया था। स्पष्टीकरण के लिए धन्यवाद – Max

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