2010-05-23 11 views
5

ऐसे मामलों में जहां ऑर्डर मायने रखता है, सभी संभावित परिणामों के मैट्रिक्स को उत्पन्न करना आसान है। ऐसा करने का एक तरीका expand.grid का उपयोग कर रहा है जैसा कि here दिखाया गया है।एन पासा फेंकने के लिए सभी संभावित परिणामों का एक मैट्रिक्स जेनरेट करें (ऑर्डर को अनदेखा करें)

यदि ऐसा नहीं होता है तो क्या होगा?

यदि मैं सही हूं, तो संभव संयोजनों की संख्या (S+N-1)!/S!(N-1)! है, जहां एस पासा की संख्या है, प्रत्येक एन पक्षों के साथ 1 के माध्यम से क्रमांकित है। (यह ज्ञात संयोजन सूत्र से अलग है क्योंकि यह संभव है एक से अधिक पासा पर दिखाई देने के लिए एक ही संख्या)। उदाहरण के लिए, चार छः पक्षीय पासा, एन = 6 और एस = 4 फेंकते समय, संभावित संयोजनों की संख्या (4 + 6-1) है!/4! (6-1)! = 9!/4! X5! = 126. मैं इन 126 संभावित परिणामों के मैट्रिक्स कैसे उत्पन्न कर सकता हूं?

धन्यवाद।

+0

पासा और एल्गोरिदम जोड़ने के लिए पुनः प्रयास किया गया। –

उत्तर

5

यहां कोड है जो gd047 और मरेक प्रदान करने के लिए बहुत दयालु थे।

S <- 6 
N <- 4 
n <- choose(S+N-1,N) 
outcomes <- t(combn(S+N-1,N,sort)) - matrix(rep(c(0:(N-1)),each=n),nrow=n) 

नोट: इस अर्थ में इष्टतम है कि यह सब उत्पन्न करने के लिए कोशिश नहीं करता और फिर ड्यूप्स फेंक है। It actually generates only those that are required

कारण है कि यह काम करता है के बारे में स्पष्टीकरण:

पासों पर संभव संख्या एन

करने के लिए 1 हैं मान लीजिए आप पासा संख्या का एक संभव संयोजन दिए गए हैं: एक्स , एक्स , ..., x एस जहां एस पासा की संख्या है।

के बाद से आदेश कोई फर्क नहीं पड़ता है, हम मान सकते हैं कि

एक्स ≤ एक्स ≤ ..., ≤ एक्स एस

अब, अनुक्रम एक्स पर विचार x + 1, एक्स + 2, ..., एक्स एस + एस -1।

(उदाहरण: 1,1,1 1,1 + 1,1 + 2 = 1,2,3 हो जाता है)।

इस नए अनुक्रम में 1 से एन + एस -1 तक की संख्या है और सभी संख्याएं अलग हैं।

आपके पासा अनुक्रम से हमारे मैपिंग को हमने 1-1 और आसानी से उलट दिया है।

इस प्रकार संख्या 1 से एन के साथ एस पासा का संभावित संयोजन उत्पन्न करने के लिए, आपको केवल सभी एन + एस -1 उत्पन्न करने की आवश्यकता है, एस संख्याओं के एस संयोजनों को 1, 2, ..., एन + एस -1। इस तरह के संयोजन को देखते हुए, आप इसे क्रमबद्ध करते हैं, छोटे से 1 को घटाते हैं, दूसरे छोटे से 1 और इतने पर एस पासा संख्या 1 से एन

उदाहरण के लिए, एन = 6 और एस कहें = 3.

आप 1 से 6 + 3-1 = 8, यानी 3 संख्याओं से 1,2, ..., 8 से 3 संख्याओं का कॉम्बो उत्पन्न करते हैं।

कहें कि आपको 3,6,7 मिलते हैं। यह 3, 6-1, 7-2 = 3,5,5 का अनुवाद करता है।

यदि आपको 1,2,8 मिल गया है। यह 1,1,6 का अनुवाद करेगा।

संयोग से, यह मैपिंग आपके पास सूत्र भी साबित करता है।

+0

@ मॉरॉन आप सही हैं! मैंने आपके जवाब को पढ़ने से पहले पोस्ट किया, यह देखते हुए कि इसमें कोड नहीं था। इसमें कोई संदेह नहीं है कि आपने पहले जवाब दिया था, इसलिए मैं अपना जवाब आपके उत्तर में एक टिप्पणी के रूप में जोड़ रहा हूं। एस <- 6 एन <- 4 एन <- चुनें (एस + एन -1, एन) परिणाम <- टी (लागू (संयोजन (एस + एन -1, एन), 2, सॉर्ट)) - मैट्रिक्स (प्रतिनिधि (सी (0: (एन -1)), प्रत्येक = एन), nrow = n) –

+0

@ gd047। ठीक है, मैंने अपना कोड जोड़ने के लिए अपना जवाब संपादित कर लिया है। अगर आपको लगता है कि उसे कुछ चाहिए तो जवाब को संपादित करने के लिए स्वतंत्र महसूस करें। –

+1

यह बहुत व्यापक जवाब है। कोड के लिए एक युक्ति: 'combn' प्रत्येक संयोजन में एक फ़ंक्शन लागू कर सकता है, इसलिए' लागू करें (संयोजन (एस + एन -1, एन), 2, सॉर्ट) 'को' combn (S + N-1, एन, प्रकार) '। – Marek

1

आम तौर पर आप मूल expand.grid और फिर unique उन लोगों से प्रत्येक परिणाम ऑर्डर करने के लिए की जरूरत है, उदाहरण के लिए का उपयोग कर लागू होते हैं:

X <- expand.grid(1:6,1:6,1:6,1:6) 
dim(unique(t(apply(X,1,sort)))) 
#[1] 126 4 

लेकिन आप मुश्किल हो और सभी परिणाम है कि आदेश दिया जाता है के सबसेट चयन कर सकते हैं:

X <- expand.grid(1:6,1:6,1:6,1:6) 
dim(subset(X, Var1>=Var2 & Var2>=Var3 & Var3>=Var4)) 
# [1] 126 4 

दूसरा संस्करण बहुत तेज़ है।

+0

+1 बहुत स्मार्ट जवाब! – nico

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