আমার মনে হয় আমার চারটি উত্তর রয়েছে, দু'টি @ অ্যাডাম রোজেনফিল্ডের মতো নির্ভুল সমাধান দিচ্ছেন তবে অসীম লুপ সমস্যা ছাড়াই এবং অন্য দুটি প্রায় নিখুঁত সমাধানের সাথে তবে প্রথমটির চেয়ে দ্রুত বাস্তবায়ন রয়েছে।
সেরা সঠিক সমাধানটির জন্য 7 টি কল প্রয়োজন rand5
, তবে বোঝার জন্য এগিয়ে যেতে দিন।
পদ্ধতি 1 - সঠিক
অ্যাডামের উত্তরের শক্তি হ'ল এটি একটি নিখুঁত অভিন্ন বিতরণ দেয় এবং খুব উচ্চ সম্ভাবনা রয়েছে (21/25) যা র্যান্ড 5 () এ কেবলমাত্র দুটি কল প্রয়োজন হবে। তবে সবচেয়ে খারাপ ক্ষেত্রে অসীম লুপ।
নীচের প্রথম সমাধানটিতে একটি নিখুঁত ইউনিফর্ম বিতরণও দেওয়া হয় তবে এর জন্য মোট ৪২ টি কল প্রয়োজন 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
আর এর সাথে পরিচিত না লোকদের জন্য, এখানে একটি সরলীকৃত সংস্করণ দেওয়া হয়েছে:
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
। সুতরাং আমরা equal টি সমান গ্রুপে উত্পন্ন এলোমেলো সংখ্যাগুলি ভাগ করতে পারি। এ সম্পর্কে আরও আলোচনার জন্য দুটি পদ্ধতি দেখুন।
এখানে সমস্ত সম্ভাব্য সংমিশ্রণ রয়েছে:
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 পদ্ধতির এক পুনরাবৃত্তি we
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 = 0)।
পদ্ধতি 3 - সঠিক
যদি পদ্ধতি 1 এবং 2 টির যুক্তি বোঝা যায়, পদ্ধতি 3 অনুসরণ করে এবং কেবলমাত্র 7 টি কল করতে হবে rand5
। এই মুহুর্তে, আমি অনুভব করি যে এটি সঠিক সমাধানের জন্য প্রয়োজনীয় ন্যূনতম সংখ্যা।
এখানে একটি আর বাস্তবায়ন:
rand5 <- function() sample(1:5,1)
rand7 <- function() (sum(sapply(1:7, function(i) i * rand5())) %% 7) + 1
আর এর সাথে পরিচিত না লোকদের জন্য, এখানে একটি সরলীকৃত সংস্করণ দেওয়া হয়েছে:
rand7 = function(){
r = 0
for(i in 1:7){
r = r + i * rand5()
}
return r %% 7 + 1
}
বিতরণ rand5
সংরক্ষণ করা হবে। আমরা যদি গণিত করি, লুপের 7 টি পুনরাবৃত্তের প্রতিটিটির 5 টি সম্ভাব্য ফলাফল রয়েছে, সুতরাং সম্ভাব্য সংমিশ্রণের মোট সংখ্যা (7 * 5) %% 7 = 0
। সুতরাং আমরা equal টি সমান গ্রুপে উত্পন্ন এলোমেলো সংখ্যাগুলিকে ভাগ করতে পারি। এ সম্পর্কে আরও আলোচনার জন্য পদ্ধতি এক এবং দুটি দেখুন।
এখানে সমস্ত সম্ভাব্য সংমিশ্রণ রয়েছে:
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
ট্রায়ালে কম দেখাবে । বেশিরভাগ উদ্দেশ্যে, আমি এটি নিয়ে বেঁচে থাকতে পারি।