যদি আপনার ওজনগুলি আঁকার তুলনায় আরও ধীরে ধীরে পরিবর্তন হয় তবে সি ++ 11 discrete_distribution
সবচেয়ে সহজ হতে চলেছে:
#include <random>
#include <vector>
std::vector<double> weights{90,56,4};
std::discrete_distribution<int> dist(std::begin(weights), std::end(weights));
std::mt19937 gen;
gen.seed(time(0));
int N = 100000;
std::vector<int> samples(N);
for(auto & i: samples)
i = dist(gen);
তবে নোট করুন, সি ++ 11 discrete_distribution
সূচনাতে সমস্ত ক্রমসংখ্যার অঙ্কগুলি গণনা করে। সাধারণত, আপনি এটি চান কারণ এটি এক সময়ের ও (এন) ব্যয়ের জন্য স্যাম্পলিংয়ের সময়ের গতি বাড়ায়। তবে দ্রুত পরিবর্তনের জন্য এটির জন্য একটি ভারী গণনা (এবং স্মৃতি) ব্যয় করতে হবে। উদাহরণস্বরূপ, যদি ওজন সেখানে কতগুলি আইটেম রয়েছে তা উপস্থাপন করে এবং প্রতিবার আপনি একটি আঁকেন, আপনি এটি সরিয়ে ফেলেন, আপনি সম্ভবত একটি কাস্টম অ্যালগরিদম চাইবেন।
উইলের উত্তর https://stackoverflow.com/a/1761646/837451 এই ওভারহেড এড়িয়ে চলে তবে সি ++ 11 এর থেকে আঁকতে ধীর হবে কারণ এটি বাইনারি অনুসন্ধান ব্যবহার করতে পারে না।
এটি এটি করে তা দেখতে আপনি প্রাসঙ্গিক লাইনগুলি দেখতে পাবেন ( /usr/include/c++/5/bits/random.tcc
আমার উবুন্টু 16.04 + জিসিসি 5.3 ইনস্টল করুন):
template<typename _IntType>
void
discrete_distribution<_IntType>::param_type::
_M_initialize()
{
if (_M_prob.size() < 2)
{
_M_prob.clear();
return;
}
const double __sum = std::accumulate(_M_prob.begin(),
_M_prob.end(), 0.0);
__detail::__normalize(_M_prob.begin(), _M_prob.end(), _M_prob.begin(),
__sum);
_M_cp.reserve(_M_prob.size());
std::partial_sum(_M_prob.begin(), _M_prob.end(),
std::back_inserter(_M_cp));
_M_cp[_M_cp.size() - 1] = 1.0;
}