Параметр не меняется для std::chi_squared_distribution

Согласно ответу на этот вопрос, я попытался изменить параметр распространение в <random> с помощью .param(). Ниже приведен игрушечный пример, где я пытаюсь это сделать.

Как для хи-квадрата, так и для нормального распределения у меня есть функция, которая генерирует два значения, второе, где параметр был изменен на .param(). Я запускаю обе функции несколько раз и распечатываю средний результат для обеих. Как и ожидалось, нормальная функция дает средние результаты 0 и 10. Неожиданно функция хи-квадрат дает средние результаты 4 и 4 вместо моих ожиданий 4 и 3. Почему мои ожидания не соответствуют распределению хи-квадрат?

#include <iostream>
#include <random>
#include <vector>

using namespace std;

vector<double> chisqtest(mt19937_64 &gen)
{
  vector<double> res(2);
  chi_squared_distribution<double> chisq_dist(4);
  res[0] = chisq_dist(gen);
  chisq_dist.param(std::chi_squared_distribution<double>::param_type (3));
  res[1] = chisq_dist(gen);
  return res;
}

vector<double> normtest(mt19937_64 &gen)
{
  vector<double> res(2);
  normal_distribution<double> norm_dist(0,1);
  res[0] = norm_dist(gen);
  norm_dist.param(std::normal_distribution<double>::param_type (10,1));
  res[1] = norm_dist(gen);
  return res;
}

int main() {
  unsigned int n = 100000;
  mt19937_64 gen(1);

  vector<double> totals = {0,0}, res(2);
  for(unsigned int i = 0; i < n; i++){
    res = chisqtest(gen); 
    totals[0] += res[0]; 
    totals[1] += res[1];
  }
  cout << totals[0]/n << " " << totals[1]/n << "\n";

  vector<double> totals2 = {0,0}, res2;
  for(unsigned int i = 0; i < n; i++){
    res2 = normtest(gen); 
    totals2[0] += res2[0]; 
    totals2[1] += res2[1];
  }

  cout << totals2[0]/n << " " << totals2[1]/n << "\n";
}

person Richard Redding    schedule 14.01.2018    source источник