এলোমেলো নম্বরগুলি সাধারণত আমরা যাকে 'অভিন্ন বন্টন' বলি, তা অনুসরণ করে, যার অর্থ যে কোনও নম্বর বাছাই করার একই সম্ভাবনা রয়েছে।
কিন্তু আপনি যদি চান যে কিছু সংখ্যা অন্যদের তুলনায় বেশি বার বাছাই করা হোক আপনার একটি ভিন্ন কৌশল প্রয়োজন:একটি ওজনযুক্ত র্যান্ডম নম্বর জেনারেটর .
কিছু ব্যবহারিক অ্যাপ্লিকেশন অন্তর্ভুক্ত:
- একটি ভিডিও গেমের লুট টেবিল, যেখানে শত্রুরা বিভিন্ন ড্রপ রেট সহ বিভিন্ন আইটেম ড্রপ করতে পারে৷
- একটি র্যাফেল, যেখানে বেশি টিকিট আছে এমন লোকের জেতার সম্ভাবনা বেশি।
সরল কৌশল
আপনি যদি রাফেলের উদাহরণ সম্পর্কে চিন্তা করেন তাহলে আপনি একটি সুস্পষ্ট সমাধান নিয়ে আসতে পারেন:একটি অ্যারে তৈরি করুন যাতে প্রতিটি 'টিকেটের' জন্য আইটেমের একটি কপি থাকে৷
উদাহরণস্বরূপ, জন যদি 4টি র্যাফেল টিকিট কেনেন এবং ডেভিড শুধুমাত্র 1টি কেনেন, তাহলে জন ডেভিডের চেয়ে 4 গুণ বেশি জয়ী হবেন।
এখানে একটি কার্যকরী বাস্তবায়ন আছে :
users = { john: 4, david: 1 } raffle = [] users.map do |name, tickets| tickets.times { raffle << name } end p raffle # [:john, :john, :john, :john, :david] p raffle.sample # :john
আমি তাদের কেনা প্রতিটি টিকিটের জন্য একবার ব্যক্তির নাম যোগ করছি এবং তারপর আমি সেই তালিকা থেকে একটি এলোমেলো নাম বেছে নিই। তালিকায় আরও বার থাকার কারণে, এটি সেই নাম বাছাই করার সম্ভাবনা বাড়িয়ে তুলবে।
আমি এই পদ্ধতি পছন্দ করি কারণ এটি খুবই সহজ এবং একবার আপনার তালিকা হয়ে গেলে একজন বিজয়ী বাছাই করা খুব দ্রুত।
ওজনের সমষ্টি
আপনি এটি করতে পারেন এমন আরেকটি উপায় রয়েছে যা আরও মেমরি-দক্ষ, ট্রেড-অফ হল একটি এলোমেলো মান বাছাই করা ধীর।
ধারণাটি হল 1 এবং সমস্ত ওজনের যোগফলের মধ্যে একটি এলোমেলো সংখ্যা বাছাই করা, এবং তারপরে লুপ করুন যতক্ষণ না আপনি এই সংখ্যার চেয়ে কম বা সমান ওজন খুঁজে পান।
এখানে কোড আছে :
def random_weighted(weighted) max = sum_of_weights(weighted) target = rand(1..max) weighted.each do |item, weight| return item if target <= weight target -= weight end end def sum_of_weights(weighted) weighted.inject(0) { |sum, (item, weight)| sum + weight } end
এই কোডটি একটি হ্যাশে লাগে যেখানে কীগুলি আইটেম এবং মানগুলি ওজন। আপনি এই পদ্ধতিটিকে এভাবে কল করতে পারেন:
random_weighted(cats: 5, dogs: 1) # :cats
এটি অনেকবার চালানোর পরে ফলাফলের বিতরণ দেখে এটি প্রত্যাশিতভাবে কাজ করে কিনা তা পরীক্ষা করতে পারেন৷
এখানে একটি উদাহরণ :
counts = Hash.new(0) def pick_number random_weighted(cats: 2, dogs: 1) end 1000.times { counts[pick_number] += 1 } p counts
এটিকে কয়েকবার চালান এবং অনুপাতটি কী হওয়া উচিত তা দেখতে আউটপুটটি দেখুন৷
উপসংহার
যদিও আরও পরিশীলিত অ্যালগরিদম আছে, এই দুটি আপনাকে ভাল পরিবেশন করা উচিত। আমি আশা করি আপনি এই নিবন্ধটি দরকারী পেয়েছেন, অনুগ্রহ করে এটি আপনার বন্ধুদের সাথে ভাগ করুন যাতে আমি আরও লিখতে পারি!