std :: normal_distribution <int>运行时错误“整数除零”</int>

时间:2012-10-18 15:13:00

标签: c++ random std normal-distribution

// 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的代码示例中我得到运行时错误“整数除零”。我唯一改变的是从doubleint的normal_distribution类型及其平均值和标准偏差。

任何建议?

2 个答案:

答案 0 :(得分:4)

std::normal_distribution的模板参数必须是浮点类型(floatdoublelong double)。使用其他任何东西都会导致未定义的行为。

由于正态分布是连续分布,因此在使用int类型时,您不希望它做什么。也许您可以使用normal_distribution<double>并将结果四舍五入到int来获得所需的结果。

答案 1 :(得分:0)

您可以使用默认概率值为0.5的binomial_distributionlink

它将返回范围[0,t]中的整数值,平均值为t / 2(如果t为偶数(t + 1)/ 2,则(t-1)/ 2具有相等的概率。)。您可以相应地设置t的值,并根据需要在结果中添加常量来进行移位。

二项分布是正态分布的离散近似(link)。正态分布理论上没有下限/上限。

我更喜欢使用以下的薄包装:

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;
  }
};
相关问题