আমি আর্টের রাজ্যটির সংক্ষিপ্ত সংক্ষিপ্ত বিবরণ দিয়ে 2015 এ অ্যাংরি জুতার এবং পিটারচেনের দুর্দান্ত উত্তরের পরিপূরক চাই:
কিছু ভাল পছন্দ
randutils
randutils
গ্রন্থাগার (উপস্থাপনা) একটি আকর্ষণীয় নতুনত্ব, একটি সহজ ইন্টারফেস এবং (ঘোষিত) শক্তসমর্থ র্যান্ডম ক্ষমতা প্রস্তাব। এর অসুবিধাগুলি রয়েছে যে এটি আপনার প্রকল্পের উপর নির্ভরতা যুক্ত করে এবং নতুন হওয়ার কারণে এটি ব্যাপকভাবে পরীক্ষা করা হয়নি। যাইহোক, নিখরচায় (এমআইটি লাইসেন্স) এবং কেবলমাত্র শিরোনাম, আমি মনে করি এটি চেষ্টা করার মতো।
সর্বনিম্ন নমুনা: একটি ডাই রোল
#include <iostream>
#include "randutils.hpp"
int main() {
randutils::mt19937_rng rng;
std::cout << rng.uniform(1,6) << "\n";
}
এমনকি লাইব্রেরিতে যদি কেউ আগ্রহী না হয় তবে ওয়েবসাইট ( http://www.pcg-random.org/ ) সাধারণভাবে র্যান্ডম সংখ্যা জেনারেশন এবং বিশেষত সি ++ গ্রন্থাগার সম্পর্কে অনেক আকর্ষণীয় নিবন্ধ সরবরাহ করে।
বুস্ট.র্যান্ডম
Boost.Random
(ডকুমেন্টেশন) হ'ল লাইব্রেরি যা অনুপ্রেরণা C++11
জাগায় <random>
, যার সাথে ইন্টারফেসের বেশিরভাগ অংশ ভাগ করে। যদিও তাত্ত্বিকভাবে বাহ্যিক নির্ভরতা হয়েও Boost
এখন অবধি "অর্ধ-মানক" গ্রন্থাগারটির একটি স্ট্যাটাস রয়েছে এবং এর Random
মডিউলটি ভাল মানের র্যান্ডম সংখ্যা জেনারেশনের জন্য শাস্ত্রীয় পছন্দ হিসাবে বিবেচিত হতে পারে। সমাধানের ক্ষেত্রে এটি দুটি সুবিধার বৈশিষ্ট্যযুক্ত C++11
:
- এটি আরও পোর্টেবল, কেবল সি ++ 03 এর জন্য সংকলক সমর্থন প্রয়োজন
- এটি
random_device
ভাল মানের বীজ সরবরাহ করার জন্য সিস্টেম-নির্দিষ্ট পদ্ধতি ব্যবহার করে
একমাত্র ছোট ত্রুটিটি হল মডিউল অফারটি random_device
কেবল শিরোনাম নয়, একটিকে সংকলন করতে এবং লিঙ্ক করতে হয় boost_random
।
সর্বনিম্ন নমুনা: একটি ডাই রোল
#include <iostream>
#include <boost/random.hpp>
#include <boost/nondet_random.hpp>
int main() {
boost::random::random_device rand_dev;
boost::random::mt19937 generator(rand_dev());
boost::random::uniform_int_distribution<> distr(1, 6);
std::cout << distr(generator) << '\n';
}
যদিও সর্বনিম্ন নমুনাটি এটির কাজটি ভাল করে, বাস্তব প্রোগ্রামগুলিতে একজোড়া উন্নতি ব্যবহার করা উচিত:
- করতে
mt19937
একটিthread_local
: জেনারেটর বেশ দ্বিধাহীনভাবে আছে (> 2 কিলোবাইট) এবং ভাল স্ট্যাক বরাদ্দ করা হয় না
mt19937
একাধিক পূর্ণসংখ্যা সহ বীজ : মার্সেন টুইস্টার একটি বড় রাষ্ট্র রয়েছে এবং প্রারম্ভিককরণের সময় আরও এনট্রপির সুবিধা নিতে পারে
কিছু খুব ভাল-না পছন্দ
সি ++ 11 গ্রন্থাগার
সর্বাধিক অভিহিতযোগ্য সমাধান হওয়ার <random>
পরেও গ্রন্থাগারটি এমনকি প্রাথমিক প্রয়োজনগুলির জন্যও তার ইন্টারফেসের জটিলতার পরিবর্তে খুব বেশি প্রস্তাব দেয় না। ত্রুটি আছেstd::random_device
: স্ট্যান্ডার্ডটি তার আউটপুটটির জন্য কোনও ন্যূনতম মানের আদেশ দেয় না (যতক্ষণ না entropy()
প্রত্যাবর্তন হয় 0
) এবং ২০১৫ সাল পর্যন্ত, মিনিজিডাব্লু (সর্বাধিক ব্যবহৃত সংকলক নয়, তবে একটি বিশেষ পছন্দ) সর্বদা 4
সর্বনিম্ন নমুনায় মুদ্রিত হবে ।
সর্বনিম্ন নমুনা: একটি ডাই রোল
#include <iostream>
#include <random>
int main() {
std::random_device rand_dev;
std::mt19937 generator(rand_dev());
std::uniform_int_distribution<int> distr(1, 6);
std::cout << distr(generator) << '\n';
}
যদি প্রয়োগটি পচা না হয় তবে এই সমাধানটি বুস্টের সমতুল্য হওয়া উচিত এবং একই পরামর্শগুলি প্রয়োগ করা হবে।
গডোটের সমাধান
সর্বনিম্ন নমুনা: একটি ডাই রোল
#include <iostream>
#include <random>
int main() {
std::cout << std::randint(1,6);
}
এটি একটি সহজ, কার্যকর এবং ঝরঝরে সমাধান। কেবল ত্রুটিপূর্ণ, এটি সংকলন করতে কিছুক্ষণ সময় লাগবে - প্রায় দুই বছর, প্রদান করা সি ++ 17 সময়মতো প্রকাশিত হয় এবং পরীক্ষামূলকভাবেrandint
ফাংশনটি নতুন স্ট্যান্ডার্ডে অনুমোদিত হয়। সম্ভবত সেই সময়ের মধ্যে বীজ মানের উপর গ্যারান্টি উন্নত হবে।
সর্বনিম্ন নমুনা: একটি ডাই রোল
#include <cstdlib>
#include <ctime>
#include <iostream>
int main() {
std::srand(std::time(nullptr));
std::cout << (std::rand() % 6 + 1);
}
পুরাতন সি সমাধানটিকে ক্ষতিকারক হিসাবে বিবেচনা করা হয়, এবং ভাল কারণে (অন্যান্য উত্তরগুলি এখানে দেখুন বা এই বিশদ বিশ্লেষণটি দেখুন) )। তবুও, এর সুবিধাগুলি রয়েছে: সহজ, বহনযোগ্য, দ্রুত এবং সৎ, এই অর্থে এটি পরিচিত যে র্যান্ডম সংখ্যাটি খুব কম শালীন হয়, এবং তাই এগুলি গুরুতর উদ্দেশ্যে ব্যবহার করার জন্য প্রলুব্ধ হয় না।
অ্যাকাউন্টিং ট্রল সমাধান
সর্বনিম্ন নমুনা: একটি ডাই রোল
#include <iostream>
int main() {
std::cout << 9;
}
যদিও 9 নিয়মিত ডাই রোলের জন্য কিছুটা অস্বাভাবিক পরিণতি হয় তবে এই সমাধানে ভাল গুণাবলীর চমৎকার সংমিশ্রণকে একজনকে প্রশংসা করতে হয়, যা দ্রুত, সহজতম, সবচেয়ে ক্যাশে-বান্ধব এবং সবচেয়ে বহনযোগ্য এক হিসাবে পরিচালিত হয়। 9 এর সাথে 4 প্রতিস্থাপনের মাধ্যমে যেকোন ধরণের ডানজন এবং ড্রাগন মারা যাওয়ার জন্য নিখুঁত জেনারেটর পাওয়া যায়, তবুও চিহ্ন, বোঝা মান 1, 2 এবং 3 এড়িয়ে চলা কেবলমাত্র ছোট্ট ত্রুটিটি হ'ল, দিলবার্টের অ্যাকাউন্টিং ট্রলগুলির খারাপ মেজাজের কারণে, এই প্রোগ্রামটি প্রকৃতপক্ষে অপরিবর্তিত আচরণকে উত্সাহ দেয়।