তাত্ত্বিকভাবে অনুকূল অ্যালগরিদম
আমি পোস্ট করা অন্য উত্তরগুলির একটি উন্নতি এখানে। অন্য উত্তরের সুবিধা রয়েছে যে অন্যের থেকে পৃথক পৃথক বিতরণ জেনারেশনের আরও সাধারণ ক্ষেত্রে প্রসারিত করা সহজ। আসলে, অন্য উত্তরটি হান এবং হোশির কারণে অ্যালগরিদমের একটি বিশেষ ক্ষেত্রে।
আমি এখানে যে অ্যালগরিদম বর্ণনা করব তা নূথ এবং ইয়াও (1976) এর উপর ভিত্তি করে। তাদের কাগজে, তারা এও প্রমাণ করেছিল যে এই অ্যালগরিদম ন্যূনতম সম্ভাব্য প্রত্যাশিত মুদ্রা ফ্লিপগুলি অর্জন করে।
এটি উদাহরণস্বরূপ, অন্যান্য উত্তর দ্বারা বর্ণিত প্রত্যাখ্যান নমুনা পদ্ধতি বিবেচনা করুন। উদাহরণ হিসাবে, ধরুন আপনি 5 টির মধ্যে একটি সংখ্যক অভিন্ন তৈরি করতে চান [0, 4]। 2 এর পরবর্তী শক্তিটি 8 হয় তাই আপনি 3 বার মুদ্রাটি ফ্লিপ করুন এবং 8 পর্যন্ত একটি এলোমেলো সংখ্যা তৈরি করুন যদি সংখ্যা 0 থেকে 4 হয় তবে আপনি এটি ফিরিয়ে দিন। অন্যথায়, আপনি এটিকে ফেলে দিন এবং আরও 8 টি সংখ্যা তৈরি করুন এবং আপনি সফল না হওয়া পর্যন্ত আবার চেষ্টা করুন। আপনি যখন নম্বরটি ছুঁড়ে ফেলেছেন তখন আপনি কিছুটা এনট্রপি নষ্ট করেছেন। ভবিষ্যতের মুদ্রা ফ্লিপের সংখ্যা কমাতে আপনি প্রত্যাশায় যে সংখ্যাটি কমাতে পারেন তার পরিবর্তে আপনি শর্ত রাখতে পারেন। কংক্রিটের সাথে একবার আপনি [0, 7] নম্বরটি তৈরি করেন, যদি এটি [0, 4] হয় তবে ফিরে আসুন। অন্যথায়, এটি 5, 6 বা 7 হয় এবং আপনি প্রতিটি ক্ষেত্রে আলাদা কিছু করেন। যদি এটি 5 হয় তবে মুদ্রাটি আবার ফ্লিপ করুন এবং ফ্লিপের উপর ভিত্তি করে 0 বা 1 প্রদান করুন। যদি এটি 6, মুদ্রা ফ্লিপ করুন এবং 2 বা 3 এ ফিরে আসুন it's এটি যদি 7 হয় তবে মুদ্রাটি ফ্লিপ করুন; যদি এটি মাথা যায়, 4 ফিরে আসুন, যদি এটির লেজগুলি শুরু হয়।
আমাদের প্রাথমিক ব্যর্থ প্রচেষ্টা থেকে বাকি ইন্ট্রপি আমাদের 3 টি কেস দিয়েছে (5, 6 বা 7)। আমরা যদি এটিকে বাইরে ফেলে দিই, তবে আমরা লগ 2 (3) মুদ্রাটি সরিয়ে ফেলি। পরিবর্তে আমরা এটি রাখি এবং 6 টি সম্ভাব্য কেস (5 এইচ, 5 টি, 6 এইচ, 6 টি, 7 এইচ, 7 টি) উত্পন্ন করতে অন্য একটি ফ্লিপের ফলাফলের সাথে এটি একত্রিত করি যা আসুন আমরা তাত্ক্ষণিক সাফল্যের 5/6 এর সম্ভাব্যতা সহ একটি চূড়ান্ত উত্তর উত্পন্ন করার চেষ্টা করি immediately ।
কোডটি এখানে:
# returns an int from [0, b)
def __gen(b):
rand_num = 0
num_choices = 1
while True:
num_choices *= 2
rand_num *= 2
if coin.flip():
rand_num += 1
if num_choices >= b:
if rand_num < b:
return rand_num
num_choices -= b
rand_num -= b
# returns an int from [a, b)
def gen(a, b):
return a + __gen(b - a)