53 lines
938 B
C++
53 lines
938 B
C++
#ifndef EXPONENTIAL_H
|
|
#define EXPONENTIAL_H
|
|
|
|
#include <cmath>
|
|
#include <random>
|
|
#include "../Random.h"
|
|
|
|
namespace Distribution {
|
|
|
|
/** exponential distribution */
|
|
template <typename T> class Exponential {
|
|
|
|
private:
|
|
|
|
const T lambda;
|
|
|
|
RandomGenerator gen;
|
|
std::exponential_distribution<T> dist;
|
|
|
|
public:
|
|
|
|
/** ctor */
|
|
Exponential(const T lambda) : lambda(lambda), gen(RANDOM_SEED), dist(lambda) {
|
|
;
|
|
}
|
|
|
|
/** get probability for the given value */
|
|
T getProbability(const T val) const {
|
|
return getProbability(lambda, val);
|
|
}
|
|
|
|
/** get an exponentially distributed random number */
|
|
T draw() {
|
|
return dist(gen);
|
|
}
|
|
|
|
/** set the seed to use */
|
|
void setSeed(const long seed) {
|
|
gen.seed(seed);
|
|
}
|
|
|
|
|
|
/** get the probability for the given value */
|
|
static T getProbability(const T lambda, const T val) {
|
|
return (val < 0) ? (0) : (lambda * std::exp( -lambda * val ));
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
#endif // EXPONENTIAL_H
|