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

FreeBSD Manual Pages

  
 
  

home | help
std::fisher_f_distribution(3) C++ Standard Libarystd::fisher_f_distribution(3)

NAME
       std::fisher_f_distribution - std::fisher_f_distribution

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

	  Produces random numbers according to the F-distribution:

	  \(P(x;m,n)=\frac{\Gamma{(\frac{m+n}{2})}
	  }{\Gamma{(\frac{m}{2})}\Gamma{(\frac{n}{2})}
       }{(\frac{m}{n})}^{\frac{m}{2}
	  }x^{\frac{m}{2}-1}{(1+\frac{m}{n}x)}^{-\frac{m+n}{2} }\)P(x;m,n) =

	  ((m+n)/2)
	  (m/2)	(n/2)

	  (m/n)m/2
	  x(m/2)-1
	  (1+

	  mx
	  n

	  )-(m+n)/2

	  \(\small m\)m	and \(\small n\)n are the degrees of freedom.

	  std::fisher_f_distribution  satisfies	all requirements of RandomNum-
       berDistribution.

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
	  m		returns	the distribution parameters
	  n		(public	member function)
	  (C++11)
	  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 <algorithm>
	#include <cmath>
	#include <iomanip>
	#include <iostream>
	#include <map>
	#include <random>
	#include <vector>

	template<int Height = 5, int BarWidth =	1, int Padding = 1, int	Offset
       = 0, class Seq>
	void draw_vbars(Seq&& s, const bool DrawMinMax = true)
	{
	    static_assert(0 < Height and 0 < BarWidth and 0 <= Padding	and  0
       <= Offset);

	    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(*std::cbegin(s)) V; V	e : s)
		qr.push_back(std::div(std::lerp(V(0), 8	* Height,
						(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 fisher	= [&gen](const float d1, const float d2)
	    {
		std::fisher_f_distribution<float> d{d1 /* m */,	d2 /* 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 << "d	= " << d1 << ",	d = " << d2 << ":\n";
		for (draw_vbars<4, 3>(bars); int n : indices)
		    std::cout << std::setw(2) << n << "	 ";
		std::cout << "\n\n";
	    };

	    fisher(/* d	= */ 1.0f, /* d	= */ 5.0f);
	    fisher(/* d	= */ 15.0f, /* d = */ 10.f);
	    fisher(/* d	= */ 100.0f, /*	d = */ 3.0f);
	}

Possible output:
	d = 1, d = 5:
							      0.4956

		       0.0021
	 0   1	 2   3	 4   5	 6   7	 8   9	10  11	12  14

	d = 15,	d = 10:
				  0.6252

		0.0023
	 0   1	 2   3	 4   5	 6

	d = 100, d = 3:

       0.4589

			  0.0021
	 0   1	 2   3	 4   5	 6   7	 8   9	10  11	12  13	14  15	16

External links
	  Weisstein, Eric W. "F-Distribution." From MathWorld  A  Wolfram  Web
       Resource.

http://cppreference.com		  2024.06.10	 std::fisher_f_distribution(3)

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

home | help