2013-02-19 84 views
1

我在想,normal_distribution函数使用什么样的随机数生成器?模拟应用的C++ normal_distribution函数

它适合科学模拟应用吗?

问候

+0

这完全取决于你的用例吗? – 111111 2013-02-19 19:24:31

+0

用于模拟应用程序。 如果你告诉我使用Mersenne-Twister发生器,它会很好! – Aleanar 2013-02-19 19:30:21

+0

请参阅此处的示例以了解如何使用正态分布的Mersenne-Twister:http://en.cppreference.com/w/cpp/numeric/random/normal_distribution – 111111 2013-02-19 19:33:47

回答

3

std::normal_distribution没有做任何的随机数生成。这是一个随机数字分布。随机数分布只映射由随机数引擎返回某种分布的值。他们自己不会做任何一代人。所以它是你关心的随机数引擎

标准提供的随机数引擎之一,std::mersenne_twister_engine是一个非常高质量的随机数引擎。您可以使用它,象这样的正态分布产生随机数:

std::random_device rd; 
std::mt19937 gen(rd()); // Create and seed the generator 
std::normal_distribution<> d(mean, deviation); // Create distribution 
std::cout << d(gen) << std::endl; // Generate random numbers according to distribution 

注意std::mt19937std::mersenne_twister_engine一个typedef

+0

std :: mt19937'是typedef for a特殊的'std :: mersenne_twister'模板实例化。 'std :: mt19937'是一个经过验证的伪随机数发生器。模板可以用产生不太好的引擎的值来实例化,所以大多数人应该坚持'std :: mt19937'。 – 2013-02-19 23:50:50

1

<random>的标准库的整点是从随机数生成器,以独立分布。 You提供了一个生成统一整数的随机数生成器,并且分布负责将该随机统一整数序列转换为期望分布的样本。

幸运的是,<random>库还包含一个随机数生成器的集合。 Mersenne Twister(std::mt19937)尤其是一个相对较好的(即快速和统计学上的高质量)。

(您还需要提供用于发生器的种子

0

我知道这个帖子很老,但是,我希望我的回答是有益的。我使用normal_distribution为传感器生成高斯噪声。这对模拟传感器是有益的。例如,假设您有一个传感器,可以为您提供2D机器人的位置。每次移动机器人时,传感器都会提供一些关于机器人位置的信息。在OpenGL中,你可以模拟这个例子。例如,您可以跟踪鼠标的位置,并将一些高斯噪声添加到鼠标的实际位置。在这种情况下,您可以使用传感器来跟踪鼠标的位置,但由于噪音而具有不确定性。