<< র্যান্ডম> এর কোন এলোমেলো সংখ্যা ইঞ্জিনের বাস্তবে অনুশীলন করা উচিত? এসটিডি :: mt19937?


21

মনে করুন আপনি <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, বা কী?


2
আপনার শেষ পয়েন্টে, সমস্ত স্ট্যান্ডার্ড ইঞ্জিন অ্যাডাপ্টার নির্দিষ্ট ডিফল্ট নির্ধারিত ক্রমাগত অনুরোধের জন্য একটি নির্দিষ্ট মান ফেরত দেওয়ার জন্য নির্দিষ্ট করা হয়, সুতরাং সেগুলি পোর্টেবল হতে হবে।
1201 প্রোগ্রাম অ্যালার্ম

উত্তর:


15

সি ++ রেফারেন্সগুলি বর্তমানে সি ++ সরবরাহ করে সমস্ত র্যান্ডম ইঞ্জিনের তালিকা করে lists যাইহোক, ইঞ্জিনগুলির নির্বাচনটি পছন্দসই হওয়ার জন্য প্রচুর পরিমাণে ছেড়ে যায় (যেমন, আমার উচ্চ মানের মানের এলোমেলো জেনারেটরের তালিকা দেখুন )। এই ক্ষেত্রে:

  • default_random_engine এটি বাস্তবায়ন-সংজ্ঞায়িত, সুতরাং ইঞ্জিনটির পরিসংখ্যানগত ত্রুটি রয়েছে যা অ্যাপ্লিকেশনটির পক্ষে যত্নশীল হতে পারে তা অজানা।
  • linear_congruential_engineরৈখিক একত্রিত জেনারেটর প্রয়োগ করে। তবে, মডুলাসটি প্রাইম এবং খুব বড় (কমপক্ষে 64৪ বিট) না হলে তাদের মান খারাপ থাকে। এছাড়াও, তারা তাদের মডুলাসের চেয়ে বেশি বীজ স্বীকার করতে পারে না।
  • minstd_rand0এবং minstd_randপ্রায় 2 ^ 31 বীজ স্বীকার করে। এটিকে একটি knuth_bমোড়ক minstd_rand0দেয় এবং একটি বে-দুরহাম এটিকে বদলে দেয়।
  • mt19937এবং mt19937_64আরও অনেক বীজ স্বীকার করতে পারত যদি সেগুলি আরও ভালভাবে আরম্ভ করা হয় (উদাহরণস্বরূপ, কেবলমাত্র এক নয়, std::seed_seqএকাধিক আউটপুট দিয়ে একটি শুরু করে random_device) তবে তারা প্রায় 2500 বাইট স্টেট ব্যবহার করে।
  • ranlux24এবং ranlux48প্রায় 577 বিট স্টেট ব্যবহার করুন তবে এগুলি ধীর গতিতে (তারা কিছু রেখে এবং অন্যান্য সিউডোরেন্ডম আউটপুটগুলি বর্জন করে কাজ করে)।

তবে, সি ++ এর দুটি ইঞ্জিনও রয়েছে যা এর এলোমেলো বৈশিষ্ট্যগুলি উন্নত করতে আরও একটি ইঞ্জিনকে আবদ্ধ করে:

  • discard_block_engine প্রদত্ত এলোমেলো ইঞ্জিনের কিছু আউটপুট বাতিল করে দেয়।
  • shuffle_order_engine প্রদত্ত এলোমেলো ইঞ্জিনের একটি বে-দুরহাম সাফল্য প্রয়োগ করে।

উদাহরণস্বরূপ, এটি একটি Bays-ডরহম এলোমেলো আছে সম্ভব, বলুন, এর mt19937, ranlux24অথবা একটি কাস্টম linear_congruential_engineসঙ্গে shuffle_order_engine। সম্ভবত মোড়ানো ইঞ্জিনটি মূলটির চেয়ে ভাল মানের। তবে নতুন ইঞ্জিনটির পরিসংখ্যানগত গুণ পরীক্ষা না করেই এটি অনুমান করা শক্ত ।

সুতরাং, এই জাতীয় পরীক্ষাগুলি মুলতুবি থাকা, এটি mt19937এখনকার সি ++ স্ট্যান্ডার্ডের সর্বাধিক ব্যবহারিক ইঞ্জিন। তবে আমি সচেতন, কমপক্ষে একটি প্রস্তাবনাতে সি ++ এর ভবিষ্যতের সংস্করণগুলিতে আরও একটি এলোমেলো সংখ্যা ইঞ্জিন যুক্ত করার জন্য ( সি ++ কাগজ পি 2075 দেখুন )।


1

মতে সি ++ রেফারেন্স , default_random_engine:

গ্রন্থাগারটি এমন কোনও জেনারেটরের নির্বাচন যা অপেক্ষাকৃত নৈমিত্তিক, আনাড়ি, এবং / বা লাইটওয়েট ব্যবহারের জন্য কমপক্ষে গ্রহণযোগ্য ইঞ্জিন আচরণ সরবরাহ করে

তাই জন্য লাইটওয়েট ব্যবহার আপনি কিছু সম্পর্কে চিন্তা করবেন না, বীজ হতে প্রয়োজন হবে না default_random_engineসঙ্গে Epoch Time (time(0))এবং যে সূক্ষ্ম যথেষ্ট হবে;)


আমি বিশ্বাস করি যে এখানে সমস্যাটি বহনযোগ্যতা। ডিফল্ট এমন একটি ইঞ্জিন হতে পারে যা ভাল পারফর্ম করে তবে এটি অন্য প্ল্যাটফর্মে পুনরুত্পাদনযোগ্য নাও হতে পারে।
bremen_matt

@ ফ্রেমেন_ম্যাট হুম ... আচ্ছা, আমাদের কেন একটি "এলোমেলো" সংখ্যা পুনরুত্পাদন করা দরকার?
ফারবোদ আহমেদিয়ান

2
পরীক্ষামূলক. পরীক্ষার উদ্দেশ্যে, আপনার পুনরুত্পাদনযোগ্য ইনপুট দরকার। একই সময়ে, আপনি এলোমেলোভাবে ইনপুটগুলি পেতে বা প্রয়োজন হতে পারে। উদাহরণস্বরূপ, বেশিরভাগ মেশিন লার্নিং অ্যালগরিদমগুলি অনুমান করে যে প্যারামিটারগুলি এলোমেলোভাবে শুরু করা হয়েছে। রানস্যাক, সিএনএন, ডিএনএন, ... অনেকগুলি অ্যালগরিদমে এলোমেলো প্যারামিটারের প্রয়োজন।
bremen_matt
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.