Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::chi_sq...distribution(3) C++ Standard Libarystd::chi_sq...distribution(3)

NAME
       std::chi_squared_distribution - std::chi_squared_distribution

Synopsis
	  Defined in header <random>
	  template< class RealType = double >  (since C++11)
	  class	chi_squared_distribution;

	  The	chi_squared_distribution   produces  random  numbers  \(\small
       x>0\)x>0	according to
	  the Chi-squared distribution:

		  \({\small    f(x;n)	  =	}\frac{x^{(n/2)-1}\exp{(-x/2)}
       }{\Gamma{(n/2)}2^{n/2}
		  }\)f(x;n) =

		  x(n/2)-1
		  e^-x/2
		  (n/2)	2n/2

	  \(\small\Gamma\)  is	the  Gamma function (See also std::tgamma) and
       \(\small	n\)n
	  are the degrees of freedom (default 1).

	  std::chi_squared_distribution	satisfies all requirements of  Random-
       NumberDistribution

Template parameters
	  RealType - The result	type generated by the generator. The effect is
       undefined if
		     this is not one of	float, double, or long double.

Member types
	  Member type	     Definition
	  result_type(C++11) RealType
	  param_type(C++11)   the  type	 of  the parameter set,	see RandomNum-
       berDistribution.

Member functions
	  constructor	constructs new distribution
	  (C++11)	(public	member function)
	  reset		resets the internal state of the distribution
	  (C++11)	(public	member function)

Generation
	  operator()	generates the next random number in the	distribution
	  (C++11)	(public	member function)

Characteristics
	  n		returns	the degrees of freedom (\(\small n\)n) distri-
       bution parameter
	  (C++11)	(public	member function)
	  param		gets or	sets the distribution parameter	object
	  (C++11)	(public	member function)
	  min		returns	the minimum potentially	generated value
	  (C++11)	(public	member function)
	  max		returns	the maximum potentially	generated value
	  (C++11)	(public	member function)

Non-member functions
	  operator==
	  operator!=		    compares two distribution objects
	  (C++11)		    (function)
	  (C++11)(removed in C++20)
	  operator<<		     performs  stream  input  and  output   on
       pseudo-random number
	  operator>>		    distribution
	  (C++11)		    (function template)

Example
       // Run this code

	#include <random>
	#include <iomanip>
	#include <map>
	#include <algorithm>
	#include <iostream>
	#include <vector>
	#include <cmath>

	template  <int Height =	5, int BarWidth	= 1, int Padding = 1, int Off-
       set = 0,	class Seq>
	void draw_vbars(Seq&& s, const bool DrawMinMax = true) {
	    static_assert((Height > 0) && (BarWidth > 0) && (Padding >=	0)  &&
       (Offset >= 0));
	    auto  cout_n = [](auto&& v,	int n =	1) { while (n--	> 0) std::cout
       << v; };
	    const  auto	 [min,	max]   =   std::minmax_element(std::cbegin(s),
       std::cend(s));
	    std::vector<std::div_t> qr;
	    for	(typedef decltype(*cbegin(s)) V; V e : s)
		qr.push_back(std::div(std::lerp(V(0),	  Height*8,    (e    -
       *min)/(*max - *min)), 8));
	    for	(auto h{Height}; h-- > 0; cout_n('\n'))	{
		cout_n(' ', Offset);
		for (auto dv : qr) {
		    const auto q{dv.quot}, r{dv.rem};
		    unsigned char d[] {	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;
	    }
	}

	int main() {
	    std::random_device rd{};
	    std::mt19937 gen{rd()};

	    auto 2 = [&gen](const float	dof) {
		std::chi_squared_distribution<float> d{	dof /* n */ };

		const int norm = 1'00'00;
		const float cutoff = 0.002f;

		std::map<int, int> hist{};
		for (int n=0; n!=norm; ++n) { ++hist[std::round(d(gen))]; }

		std::vector<float> bars;
		std::vector<int> indices;
		for (auto const& [n, p]	: hist)	{
		    if (float x	= p * (1.0/norm); cutoff < x) {
			bars.push_back(x);
			indices.push_back(n);
		    }
		}

		std::cout << "dof = " << dof <<	":\n";
		draw_vbars<4,3>(bars);
		for (int n : indices) {	std::cout << ""	<< std::setw(2)	 <<  n
       << "  ";	}
		std::cout << "\n\n";
	    };

	    for	(float dof : {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
	    * Weisstein, Eric W. "Chi-Squared Distribution." From MathWorld--A
       Wolfram Web
	      Resource.
	    * Chi-squared distribution.	From Wikipedia.

http://cppreference.com		  2022.07.31	 std::chi_sq...distribution(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::chi_squared_distribution&sektion=3&manpath=FreeBSD+Ports+15.0>

home | help