std::student_t_distribution

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

生成随机浮点值 x,分布服从概率密度函数:

p(x|n) =
1
·
Γ(
n+1
2
)
Γ(
n
2
)
·

1+
x2
n


-
n+1
2

其中 n自由度 的数量。给定 n + 1 个独立测量,每个都带标准差未知的加性误差(如物理测量),估计未知正态分布值的均值时使用此分布。或者,给定 n + 1 个样本,估计拥有未知标准差的正态分布的未知平均值时,使用此分布。

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

目录

[编辑]模板形参

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

[编辑]成员类型

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

[编辑]成员函数

构造新分布
(公开成员函数)[编辑]
(C++11)
重置分布的内部状态
(公开成员函数)[编辑]
生成
(C++11)
生成分布中的下个随机数
(公开成员函数)[编辑]
特征
返回 n 分布参数(自由度)
(公开成员函数)[编辑]
(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()};   std::student_t_distribution<> d{10.0f};   constint norm =10'000; const float cutoff = 0.000'3f;   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(constauto&[n, p]: hist)if(float x = p *(1.0f/ norm); cutoff < x){ bars.push_back(x); indices.push_back(n);}   for(draw_vbars<8, 5>(bars);constint n : indices)std::cout<<" "<<std::setw(2)<< n <<" ";std::cout<<'\n';}

可能的输出:

 █████ ┬ 0.3753 █████ │ ▁▁▁▁▁ █████ │ █████ █████ ▆▆▆▆▆ │ █████ █████ █████ │ █████ █████ █████ │ ▄▄▄▄▄ █████ █████ █████ ▄▄▄▄▄ │ ▁▁▁▁▁ ▃▃▃▃▃ █████ █████ █████ █████ █████ ▃▃▃▃▃ ▁▁▁▁▁ ▁▁▁▁▁ ┴ 0.0049 -4 -3 -2 -1 0 1 2 3 4 5

[编辑]外部链接

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