মনে করুন আপনি <random>
ব্যবহারিক প্রোগ্রামে সি ++ সুবিধা ব্যবহার করতে চান ("ব্যবহারিক" - এর কিছু সংজ্ঞার জন্য এখানে সীমাবদ্ধতাগুলি এই প্রশ্নের একধরণের অংশ)। আপনি মোটামুটিভাবে কোড পেয়েছেন:
int main(int argc, char **argv) {
int seed = get_user_provided_seed_value(argc, argv);
if (seed == 0) seed = std::random_device()();
ENGINE g(seed); // TODO: proper seeding?
go_on_and_use(g);
}
আমার প্রশ্ন, আপনার কোন ধরণের জন্য ব্যবহার করা উচিত ENGINE
?
আমি সবসময় বলতাম
std::mt19937
কারণ এটি টাইপ করা দ্রুত এবং নামটির স্বীকৃতি ছিল। তবে এই দিনগুলিতে সবার মনে হচ্ছে মনে হচ্ছে যে মার্সেন টুইস্টার খুব ভারী ওজন এবং ক্যাশে-বন্ধুত্বপূর্ণ এবং এমনকি অন্যরা যে সমস্ত পরিসংখ্যান পরীক্ষায় উত্তীর্ণ হয় তাও পাস করে না।আমি বলতে চাই
std::default_random_engine
কারণ এটি স্পষ্টতই "ডিফল্ট"। তবে আমি জানি না এটি প্ল্যাটফর্ম থেকে প্ল্যাটফর্মের পরিবর্তিত হয় কিনা এবং আমি জানি না এটি পরিসংখ্যানগত দিক থেকে কোনও ভাল কিনা।যেহেতু আজকাল প্রত্যেকে 64৪-বিট প্ল্যাটফর্মে রয়েছে তাই আমাদের কি কমপক্ষে ব্যবহার
std::mt19937_64
করা উচিতstd::mt19937
?আমি বলতে চাই
pcg64
বাxoroshiro128
কারণ এগুলি তাদের কাছে শ্রদ্ধাজনক এবং হালকা ওজনের বলে মনে হয় তবে এগুলির কোনও অস্তিত্ব নেই<random>
।আমি কিছু জানি না
minstd_rand
,minstd_rand0
,ranlux24
,knuth_b
নিশ্চয় তারা কিছু জন্য ভাল হবে হবে - ইত্যাদি?
স্পষ্টতই এখানে কিছু প্রতিযোগিতামূলক বাধা আছে।
ইঞ্জিনের শক্তি। (
<random>
কোনও ক্রিপ্টোগ্রাফিক দিক থেকে শক্তিশালী পিআরএনজি নেই, তবে এখনও, কিছু মানক অন্যদের চেয়ে "দুর্বল", তাই না?)sizeof
ইঞ্জিন.এর গতি
operator()
।বীজ হ্রাস।
mt19937
কুখ্যাতভাবে সঠিকভাবে বীজ করা শক্ত কারণ এটির আরম্ভ করার মতো অবস্থা রয়েছে।গ্রন্থাগার বিক্রেতাদের মধ্যে বহনযোগ্যতা। যদি
foo_engine
কোনও বিক্রেতার কাছ থেকে অন্য বিক্রেতার কাছ থেকে বিভিন্ন সংখ্যা তৈরি হয় তবেfoo_engine
এটি কিছু অ্যাপ্লিকেশনের জন্য ভাল নয়। (আশা করি এটি সম্ভবত আর কিছু বাদ দেয় নাdefault_random_engine
))
এই সমস্ত প্রতিবন্ধকতা যথাসম্ভব সর্বোত্তমভাবে ওজন করে আপনি কী বলবেন চূড়ান্ত "সেরা-অনুশীলনটি-স্ট্যান্ডার্ড-লাইব্রেরির মধ্যে থাকা" উত্তর? আমার কি কেবল ব্যবহার করা উচিত std::mt19937
, বা কী?