Я хочу определить конкретную функцию плотности вероятности (pdf) для n чисел в C ++, а затем выбрать некоторые из них позже в моем коде.
мой pdf: P (x) = (1 / logn) * f (x) ^ (- 2)
f (x) имеет детерминированное число, которое уже определено для каждого x ранее в моем коде.
Я предпочитаю использовать стандартную библиотечную функцию, так как я должен использовать свою программу в компьютерном кластере, который, используя дополнительные библиотеки, такие как boost, скорее всего, создаст дополнительные проблемы в этом кластере.
мой начальный код, который я нашел:
for(int x=1;x<n+1;x++){
// I calculate all f(x) and therefore P(x) here
}
std::default_random_engine generator;
std::discrete_distribution<int> distribution { .. not sure how to use P(x)s here .. };
int prob[n]={};
for (int i=0; i<n; ++i) {
int number = distribution(generator);
++prob[number];
}
Спасибо заранее.
Теперь вы можете построить вектор с весами:
std::vector< double> weights( n);
for( int i = 0; i < n; ++i) {
weights[i] = pdf( i + 1);
}
std::default_random_engine generator;
std::discrete_distribution<int> distribution( weights.begin(), weights.end()) ;
int prob[n]={};
for ( int i=0; i<n; ++i) {
int number = distribution( generator);
++prob[number];
}
Это сгенерирует, начиная с 0, так работает discrete_distribution, но вы можете без потери корректности предположить, что значения рассчитываются для диапазона 1, ..., n
(веса рассчитаны для 1, ..., n
).
Других решений пока нет …