मुझे लगता है कि मेरे पास चार उत्तर हैं, दो सटीक समाधान दे रहे हैं जैसे @ अदम रोसेनफील्ड लेकिन अनंत लूप समस्या के बिना, और अन्य दो लगभग पूर्ण समाधान के साथ लेकिन पहले एक की तुलना में तेजी से कार्यान्वयन।
सर्वोत्तम सटीक समाधान के लिए 7 कॉल की आवश्यकता होती है rand5
, लेकिन समझने के लिए आगे बढ़ने देता है।
विधि 1 - सटीक
एडम के जवाब की ताकत यह है कि यह एक समान वितरण प्रदान करता है, और बहुत अधिक संभावना (21/25) है कि रैंड 5 () को केवल दो कॉल की आवश्यकता होगी। हालांकि, सबसे खराब स्थिति अनंत लूप है।
नीचे दिया गया पहला समाधान भी एक समान वर्दी वितरण देता है, लेकिन इसके लिए कुल 42 कॉल की आवश्यकता होती है rand5
। कोई अनंत छोर नहीं।
यहाँ एक आर कार्यान्वयन है:
rand5 <- function() sample(1:5,1)
rand7 <- function() (sum(sapply(0:6, function(i) i + rand5() + rand5()*2 + rand5()*3 + rand5()*4 + rand5()*5 + rand5()*6)) %% 7) + 1
R से परिचित नहीं लोगों के लिए, यहाँ एक सरलीकृत संस्करण है:
rand7 = function(){
r = 0
for(i in 0:6){
r = r + i + rand5() + rand5()*2 + rand5()*3 + rand5()*4 + rand5()*5 + rand5()*6
}
return r %% 7 + 1
}
के वितरण को rand5
संरक्षित किया जाएगा। यदि हम गणित करते हैं, तो लूप के 7 पुनरावृत्तियों में से प्रत्येक में 5 ^ 6 संभावित संयोजन होते हैं, इस प्रकार कुल संयोजनों की संख्या होती है (7 * 5^6) %% 7 = 0
। इस प्रकार हम 7 के बराबर समूहों में उत्पन्न यादृच्छिक संख्याओं को विभाजित कर सकते हैं। इस पर अधिक चर्चा के लिए विधि दो देखें।
यहां सभी संभावित संयोजन दिए गए हैं:
table(apply(expand.grid(c(outer(1:5,0:6,"+")),(1:5)*2,(1:5)*3,(1:5)*4,(1:5)*5,(1:5)*6),1,sum) %% 7 + 1)
1 2 3 4 5 6 7
15625 15625 15625 15625 15625 15625 15625
मुझे लगता है कि आदम की विधि बहुत तेजी से चलेगी यह दिखाने के लिए सीधे आगे है। rand5
एडम के समाधान में 42 या अधिक कॉल होने की संभावना बहुत कम है ( (4/25)^21 ~ 10^(-17)
)।
विधि 2 - सटीक नहीं
अब दूसरी विधि, जो लगभग समान है, लेकिन इसके लिए 6 कॉल की आवश्यकता होती है rand5
:
rand7 <- function() (sum(sapply(1:6,function(i) i*rand5())) %% 7) + 1
यहाँ एक सरलीकृत संस्करण है:
rand7 = function(){
r = 0
for(i in 1:6){
r = r + i*rand5()
}
return r %% 7 + 1
}
यह अनिवार्य रूप से विधि 1 का एक पुनरावृत्ति है। यदि हम सभी संभावित संयोजनों को उत्पन्न करते हैं, तो यहां परिणाम हैं:
table(apply(expand.grid(1:5,(1:5)*2,(1:5)*3,(1:5)*4,(1:5)*5,(1:5)*6),1,sum) %% 7 + 1)
1 2 3 4 5 6 7
2233 2232 2232 2232 2232 2232 2232
5^6 = 15625
परीक्षणों में एक बार और एक संख्या दिखाई देगी ।
अब, विधि 1 में, 1 से 6 जोड़कर, हम क्रमिक संख्या 2233 को क्रमिक बिंदु पर ले जाते हैं। इस प्रकार कुल संयोजनों की संख्या मेल खाएगी। यह काम करता है क्योंकि 5 ^ 6 %% 7 = 1, और फिर हम 7 उचित भिन्नताएं करते हैं, इसलिए (7 * 5 ^ 6 %% 7 = 1)।
विधि 3 - सटीक
यदि विधि 1 और 2 के तर्क को समझा जाता है, तो विधि 3 का अनुसरण होता है, और इसके लिए केवल 7 कॉल की आवश्यकता होती है rand5
। इस बिंदु पर, मुझे लगता है कि यह सटीक समाधान के लिए आवश्यक कॉल की न्यूनतम संख्या है।
यहाँ एक आर कार्यान्वयन है:
rand5 <- function() sample(1:5,1)
rand7 <- function() (sum(sapply(1:7, function(i) i * rand5())) %% 7) + 1
R से परिचित नहीं लोगों के लिए, यहाँ एक सरलीकृत संस्करण है:
rand7 = function(){
r = 0
for(i in 1:7){
r = r + i * rand5()
}
return r %% 7 + 1
}
के वितरण को rand5
संरक्षित किया जाएगा। यदि हम गणित करते हैं, तो लूप के 7 पुनरावृत्तियों में से प्रत्येक में 5 संभावित परिणाम हैं, इस प्रकार कुल संयोजनों की संख्या है (7 * 5) %% 7 = 0
। इस प्रकार हम 7 के बराबर समूहों में उत्पन्न यादृच्छिक संख्याओं को विभाजित कर सकते हैं। इस पर अधिक चर्चा के लिए विधि एक और दो देखें।
यहां सभी संभावित संयोजन दिए गए हैं:
table(apply(expand.grid(0:6,(1:5)),1,sum) %% 7 + 1)
1 2 3 4 5 6 7
5 5 5 5 5 5 5
मुझे लगता है कि यह दिखाना आगे सीधे है कि एडम की विधि अभी भी तेजी से चलेगी। rand5
एडम के समाधान में 7 या अधिक कॉल होने की संभावना अभी भी छोटी है ( (4/25)^3 ~ 0.004
)।
विधि 4 - सटीक नहीं
यह दूसरी विधि का मामूली बदलाव है। यह लगभग समान है, लेकिन इसके लिए 7 कॉल की आवश्यकता होती है rand5
, जो कि विधि 2 के लिए एक अतिरिक्त है:
rand7 <- function() (rand5() + sum(sapply(1:6,function(i) i*rand5())) %% 7) + 1
यहाँ एक सरलीकृत संस्करण है:
rand7 = function(){
r = 0
for(i in 1:6){
r = r + i*rand5()
}
return (r+rand5()) %% 7 + 1
}
यदि हम सभी संभावित संयोजनों को उत्पन्न करते हैं, तो परिणामी मायने रखता है:
table(apply(expand.grid(1:5,(1:5)*2,(1:5)*3,(1:5)*4,(1:5)*5,(1:5)*6,1:5),1,sum) %% 7 + 1)
1 2 3 4 5 6 7
11160 11161 11161 11161 11161 11161 11160
5^7 = 78125
ट्रायल में एक बार दो नंबर कम दिखाई देंगे । अधिकांश उद्देश्यों के लिए, मैं उसी के साथ रह सकता हूं।