std::normal_distribution
来自cppreference.com
<tbody>
</tbody>
| 在标头 <random> 定义
|
||
template< class RealType = double > class normal_distribution; |
(C++11 起) | |
生成服从正态(高斯)随机数分布的随机数。它定义为:
- f(x; μ,σ) =
exp⎛1 σ√2π
⎜
⎝
⎛-1 2
⎜
⎝
⎞x-μ σ
⎟
⎠2
⎞
⎟
⎠
此处 μ 为均值 (mean) 而 σ 为标准差 (stddev)。
std::normal_distribution 满足随机数分布 (RandomNumberDistribution) 的所有要求。
模板形参
| RealType | - | 生成器所生成的结果类型。如果它不是 float、double 或 long double 之一,那么效果未定义。
|
成员类型
| 成员类型 | 定义 |
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++11)(C++20 移除) |
比较两个分布对象 (函数) |
(C++11) |
执行伪随机数分布的流输入和输出 (函数模板) |
示例
运行此代码
#include <cmath>
#include <iomanip>
#include <iostream>
#include <map>
#include <random>
#include <string>
int main()
{
std::random_device rd{};
std::mt19937 gen{rd()};
// 接近均值的值最有可能。
// 标准差影响生成的值距离均值的分散程度。
std::normal_distribution d{5.0, 2.0};
// 从正态分布中抽取一个样本,并将其舍入为整数
auto random_int = [&d, &gen]{ return std::lround(d(gen)); };
std::map<long, unsigned> histogram{};
for (auto n{10000}; n; --n)
++histogram[random_int()];
for (const auto [k, v] : histogram)
std::cout << std::setw(2) << k << ' ' << std::string(v / 200, '*') << '\n';
}
可能的输出:
-1
0
1 *
2 ***
3 ******
4 ********
5 **********
6 ********
7 *****
8 ***
9 *
10
11
外部链接
| 1. | Weisstein, Eric W. “正态分布” 来自 MathWorld — A Wolfram Web Resource。 |
| 2. | 正态分布 — 来自维基百科。 |