我有一个.arff
文件,其中包含一个浮点数列表。我需要在每个数字上加一个高斯噪声,在MATLAB中会是:
m = m+k*randn(size(m)
其中m
是列表中的一个数字,k
是标准偏差,其值为0.1
。相当于C++
的{{1}}是什么?
你能举个例子吗?
答案 0 :(得分:6)
将std::normal_distribution
与适当的生成器一起使用(std::default_random_engine
通常可以正常工作)。有关C ++标准库的所有随机数生成工具的详细信息,请参阅http://en.cppreference.com/w/cpp/numeric/random。
#include <iostream>
#include <iterator>
#include <random>
int main() {
// Example data
std::vector<double> data = {1., 2., 3., 4., 5., 6.};
// Define random generator with Gaussian distribution
const double mean = 0.0;
const double stddev = 0.1;
std::default_random_engine generator;
std::normal_distribution<double> dist(mean, stddev);
// Add Gaussian noise
for (auto& x : data) {
x = x + dist(generator);
}
// Output the result, for demonstration purposes
std::copy(begin(data), end(data), std::ostream_iterator<double>(std::cout, " "));
std::cout << "\n";
return 0;
}
输出:
0.987803 1.89132 3.06843 3.89248 5.00333 6.07448
进一步考虑
对于体面的统计属性,您可能希望选择std::mersenne_twister_engine
生成器(或者,为方便起见,std::mt19937
预定义版本),并使用std::random_device
对其进行播种:
std::mt19937 generator(std::random_device{}());
[注意:从std::random_device
播种是一个很好的做法;如果您使用当前时间作为种子,则可以在多个生成器中使用相同的种子值(例如,在非常短的时间内初始化多个生成器时)。如果可用,std::random_device
将从系统获得熵。]
为了避免每次都将生成器传递给发行版,您可以执行以下操作:
auto dist = std::bind(std::normal_distribution<double>{mean, stddev},
std::mt19937(std::random_device{}()));
然后您可以按如下方式使用:
double val = dist();
答案 1 :(得分:3)
c ++标准现在包含几个随机数的分布。
您正在寻找std::normal_distribution。
在文档中,您还可以找到code sample
// construct a trivial random generator engine from a time-based seed:
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
std::default_random_engine generator (seed);
std::normal_distribution<double> distribution (0.0,1.0);
std::cout << "some Normal-distributed(0.0,1.0) results:" << std::endl;
for (int i=0; i<10; ++i)
std::cout << distribution(generator) << std::endl;
给构造函数std :: normal_distribution的参数是第一个均值(0.0)和标准偏差(1.0)。