std::chi_squared_distribution - cppreference.com

template<classRealType=double>classchi_squared_distribution;(since C++11)The chi_squared_distribution produces random numbers x>0 according to the

Chi-squared distribution

:

f(x;n) = x(n/2)-1
e-x/2Γ(n/2) 2n/2
Γ is the

Gamma function

(See also

std::tgamma

) and n are the

degrees of freedom

(default 1).

std::chi_squared_distribution

satisfies all requirements of

RandomNumberDistribution

.

Template parameters

RealType - The result type generated by the generator. The effect is undefined if this is not one of float, double, or longdouble. Member types

Member type Definition result_type(C++11)RealTypeparam_typethe type of the parameter set, see

RandomNumberDistribution

. Member functions

(constructor)

constructs new distribution
(public member function)

[edit]

reset

resets the internal state of the distribution
(public member function)

[edit]

Generation

operator()

generates the next random number in the distribution
(public member function)

[edit]

Characteristics

n

(C++11)

returns the degrees of freedom (n) distribution parameter
(public member function)

[edit]

param

gets or sets the distribution parameter object
(public member function)

[edit]

min

returns the minimum potentially generated value
(public member function)

[edit]

max

returns the maximum potentially generated value
(public member function)

[edit]

Non-member functions

Example

Run this code

#include<algorithm>#include<cmath>#include<iomanip>#include<iostream>#include<map>#include<random>#include<vector>template<intHeight=5,intBarWidth=1,intPadding=1,intOffset=0,classSeq>voiddraw_vbars(Seq&&s,constboolDrawMinMax=true){static_assert(0<Heightand0<BarWidthand0<=Paddingand0<=Offset);autocout_n=[](auto&&v,intn=1){while(n-->0)std::cout<<v;};constauto[min,max]=std::minmax_element(std::cbegin(s),std::cend(s));std::vector<std::div_t>qr;for(typedefdecltype(*std::cbegin(s))V;Ve:s)qr.push_back(std::div(std::lerp(V(0),8*Height,(e-*min)/(*max-*min)),8));for(autoh{Height};h-->0;cout_n('\n')){cout_n(' ',Offset);for(autodv:qr){constautoq{dv.quot},r{dv.rem};unsignedchard[]{0xe2,0x96,0x88,0};// Full Block: '█'q<h?d[0]=' ',d[1]=0:q==h?d[2]-=(7-r):0;cout_n(d,BarWidth),cout_n(' ',Padding);}if(DrawMinMax&&Height>1)Height-1==h?std::cout<<"┬ "<<*max:h?std::cout<<"│ ":std::cout<<"┴ "<<*min;}}intmain(){std::random_devicerd{};std::mt19937gen{rd()};autoχ2=[&gen](constfloatdof){std::chi_squared_distribution<float>d{dof/* n */};constintnorm=1'00'00;constfloatcutoff=0.002f;std::map<int,int>hist{};for(intn=0;n!=norm;++n)++hist[std::round(d(gen))];std::vector<float>bars;std::vector<int>indices;for(autoconst&[n,p]:hist)if(floatx=p*(1.0/norm);cutoff<x){bars.push_back(x);indices.push_back(n);}std::cout<<"dof = "<<dof<<":\n";for(draw_vbars<4,3>(bars);intn:indices)std::cout<<std::setw(2)<<n<<" ";std::cout<<"\n\n";};for(floatdof:{1.f,2.f,3.f,4.f,6.f,9.f})χ2(dof);}Possible output:

dof = 1: ███ ┬ 0.5271 ███ │ ███ ███ │ ███ ███ ▇▇▇ ▃▃▃ ▂▂▂ ▁▁▁ ▁▁▁ ▁▁▁ ▁▁▁ ┴ 0.003 0 1 2 3 4 5 6 7 8 dof = 2: ███ ┬ 0.3169 ▆▆▆ ███ ▃▃▃ │ ███ ███ ███ ▄▄▄ │ ███ ███ ███ ███ ▇▇▇ ▄▄▄ ▃▃▃ ▂▂▂ ▁▁▁ ▁▁▁ ▁▁▁ ┴ 0.004 0 1 2 3 4 5 6 7 8 9 10 dof = 3: ███ ▃▃▃ ┬ 0.2439 ███ ███ ▄▄▄ │ ▃▃▃ ███ ███ ███ ▇▇▇ ▁▁▁ │ ███ ███ ███ ███ ███ ███ ▆▆▆ ▄▄▄ ▃▃▃ ▂▂▂ ▁▁▁ ▁▁▁ ▁▁▁ ┴ 0.0033 0 1 2 3 4 5 6 7 8 9 10 11 12 dof = 4: ▂▂▂ ███ ▃▃▃ ┬ 0.1864 ███ ███ ███ ███ ▂▂▂ │ ███ ███ ███ ███ ███ ▅▅▅ ▁▁▁ │ ▅▅▅ ███ ███ ███ ███ ███ ███ ███ ▆▆▆ ▄▄▄ ▃▃▃ ▂▂▂ ▂▂▂ ▁▁▁ ▁▁▁ ▁▁▁ ┴ 0.0026 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 dof = 6: ▅▅▅ ▇▇▇ ███ ▂▂▂ ┬ 0.1351 ▅▅▅ ███ ███ ███ ███ ▇▇▇ ▁▁▁ │ ▁▁▁ ███ ███ ███ ███ ███ ███ ███ ▅▅▅ ▂▂▂ │ ▁▁▁ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ▅▅▅ ▄▄▄ ▃▃▃ ▂▂▂ ▁▁▁ ▁▁▁ ▁▁▁ ┴ 0.0031 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 dof = 9: ▅▅▅ ▇▇▇ ███ ███ ▄▄▄ ▂▂▂ ┬ 0.1044 ▃▃▃ ███ ███ ███ ███ ███ ███ ▅▅▅ ▁▁▁ │ ▄▄▄ ███ ███ ███ ███ ███ ███ ███ ███ ███ ▆▆▆ ▃▃▃ │ ▄▄▄ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ▆▆▆ ▄▄▄ ▃▃▃ ▂▂▂ ▁▁▁ ▁▁▁ ▁▁▁ ┴ 0.0034 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 External links