가중치가 그려지는 것보다 더 느리게 변경되면 C ++ 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));//if you want different results from different runs
int N = 100000;
std::vector<int> samples(N);
for(auto & i: samples)
i = dist(gen);
//do something with your samples...
그러나 C ++ 11 discrete_distribution
은 초기화시 모든 누적 합계를 계산합니다. 일반적으로 한 번의 O (N) 비용으로 샘플링 시간을 단축하기 때문에이를 원합니다. 그러나 급변하는 배포의 경우 계산 (및 메모리) 비용이 많이 듭니다. 예를 들어 가중치가 항목 수를 나타내며 그릴 때마다 항목을 제거하면 사용자 지정 알고리즘이 필요할 것입니다.
Will의 답변 https://stackoverflow.com/a/1761646/837451 은이 오버 헤드를 피하지만 이진 검색을 사용할 수 없기 때문에 C ++ 11보다 가져 오는 속도가 느립니다.
이 작업을 수행하는지 확인하려면 관련 줄을 볼 수 있습니다 ( /usr/include/c++/5/bits/random.tcc
Ubuntu 16.04 + GCC 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);
// Now normalize the probabilites.
__detail::__normalize(_M_prob.begin(), _M_prob.end(), _M_prob.begin(),
__sum);
// Accumulate partial sums.
_M_cp.reserve(_M_prob.size());
std::partial_sum(_M_prob.begin(), _M_prob.end(),
std::back_inserter(_M_cp));
// Make sure the last cumulative probability is one.
_M_cp[_M_cp.size() - 1] = 1.0;
}