// construct a trivial random generator engine from a time-based seed:
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
std::default_random_engine generator (seed);
std::normal_distribution<int> distribution (132,20);
std::cout << "some Normal-distributed results:" << std::endl;
for (int i=0; i<10; ++i)
std::cout << distribution(generator) << std::endl;
Из этого примера кода из cplusplus Я получаю ошибку времени выполнения «Целочисленное деление на ноль». Единственное, что я изменил, это тип normal_distribution из double
в int
и его среднее и стандартное отклонение.
Есть предложения?
Параметр шаблона для std::normal_distribution
должен иметь тип с плавающей запятой (float
, double
, или же long double
). Использование чего-либо еще приведет к неопределенному поведению.
Поскольку нормальное распределение — это непрерывное распространение, не совсем понятно, что вы ожидаете от него при использовании int
тип. Может быть, вы можете получить желаемый результат с помощью normal_distribution<double>
и округлить результат до int
,
Ты можешь использовать binomial_distribution
со значением вероятности по умолчанию 0,5.
ссылка на сайт
Он будет возвращать целочисленные значения в диапазоне [0, t], со средним значением при t / 2 (в случае, если t еще четное (t + 1) / 2, (t-1) / 2 имеют равную вероятность). Вы можете установить значение t соответственно и сместить, добавив константу к результату, если это необходимо.
Биномиальное распределение является дискретным приближением нормального распределения (ссылка на сайт). Нормальные распределения теоретически не имеют нижних / верхних пределов.
Я предпочитаю использовать следующую тонкую обертку над оригиналом:
template <typename T>
class NormalDistribution {
private:
std::mt19937 mt;
std::normal_distribution<T> dis;
public:
NormalDistribution(T mu, T sigma):dis(mu, sigma) {
std::random_device rd;
mt.seed(rd());
}
NormalDistribution(T mu, T sigma, unsigned seed ):dis(mu, sigma) {
mt.seed(seed);
}
T random() {
return dis(mt);
}
};
template <>
class NormalDistribution<int> {
private:
std::mt19937 mt;
std::binomial_distribution<int> dis;
int _min;
public:
NormalDistribution(int min, int max):dis(max-min) {
std::random_device rd;
mt.seed(rd());
}
NormalDistribution(int min, int max, unsigned seed):dis(max-min), _min(min) {
mt.seed(seed);
}
int random() {
return dis(mt)+_min;
}
};