std::fisher_f_distribution

来自cppreference.com
< cpp‎ | numeric‎ | random
 
 
 
 
 
在标头 <random> 定义
template<class RealType =double>
class fisher_f_distribution;
(C++11 起)

产生随机数,服从 F 分布

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

mn自由度

std::fisher_f_distribution 满足随机数分布(RandomNumberDistribution) 的所有要求。

目录

[编辑]模板形参

RealType - 生成器所生成的结果类型。如果它不是 floatdoublelongdouble 之一,那么效果未定义。

[编辑]成员类型

成员类型 定义
result_type(C++11)RealType
param_type(C++11) 参数集的类型,见随机数分布(RandomNumberDistribution)

[编辑]成员函数

构造新分布
(公开成员函数)[编辑]
(C++11)
重置分布的内部状态
(公开成员函数)[编辑]
生成
(C++11)
生成分布中的下个随机数
(公开成员函数)[编辑]
特征
(C++11)
返回分布参数
(公开成员函数)[编辑]
(C++11)
获取或设置随机参数对象
(公开成员函数)[编辑]
(C++11)
返回潜在生成的最小值
(公开成员函数)[编辑]
(C++11)
返回潜在生成的最大值
(公开成员函数)[编辑]

[编辑]非成员函数

(C++11)(C++11)(C++20 移除)
比较两个分布对象
(函数)[编辑]
执行伪随机数分布的流输入和输出
(函数模板)[编辑]

[编辑]示例

#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, constbool 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;};   constauto[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){constauto q{dv.quot}, r{dv.rem};unsignedchar d[]{0xe2, 0x96, 0x88, 0};// 完整块:'█' 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](constfloat d1, constfloat d2){ std::fisher_f_distribution<float> d{d1 /* m */, d2 /* n */};   constint norm =1'00'00;constfloat 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(autoconst&[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);}

可能的输出:

 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

[编辑]外部链接

Weisstein, Eric W. “F 分布”来自 MathWorld--A Wolfram Web Resource。
close