станд :: normal_distribution & Lt; & INT GT; ошибка времени выполнения «Целочисленное деление на ноль»

// 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 и его среднее и стандартное отклонение.

Есть предложения?

1

Решение

Параметр шаблона для std::normal_distribution должен иметь тип с плавающей запятой (float, double, или же long double). Использование чего-либо еще приведет к неопределенному поведению.

Поскольку нормальное распределение — это непрерывное распространение, не совсем понятно, что вы ожидаете от него при использовании int тип. Может быть, вы можете получить желаемый результат с помощью normal_distribution<double> и округлить результат до int,

4

Другие решения

Ты можешь использовать 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;
}
};
0

По вопросам рекламы [email protected]