1
// 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のこのコード例から、実行時エラー「ゼロによる整数除算」が発生します。私が変更したのは、からdoubleへのnormal_distributionのタイプintと、その平均および標準偏差だけです。

何か提案はありますか?

4

2 に答える 2

4

テンプレートパラメータstd::normal_distributionは、浮動小数点型(、、、または)である必要がfloatありdoubleますlong double。それ以外のものを使用すると、未定義の動作が発生します。

正規分布は連続分布であるため、型を使用するときに何を期待するかは明確ではありませんintnormal_distribution<double>たぶん、結果を使用して丸めることで、必要な結果を得ることができますint

于 2012-10-18T15:27:35.843 に答える
1

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;
  }
};
于 2015-05-23T14:03:24.760 に答える