【问题标题】:C++ normal_distribution function for simulation application用于仿真应用的 C++ normal_distribution 函数
【发布时间】:2013-02-19 19:23:04
【问题描述】:

我想知道 normal_distribution 函数使用什么样的随机数生成器?

它适合科学模拟应用吗?

问候

【问题讨论】:

标签: c++ simulation


【解决方案1】:

std::normal_distribution 不生成任何随机数。这是一个随机数分布。随机数分布仅将 随机数引擎 返回的值映射到某种分布。他们自己不做任何一代。所以你关心的是随机数engine

标准提供的随机数引擎之一,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::mt19937typedefstd::mersenne_twister_engine

【讨论】:

  • std::mt19937std::mersenne_twister 模板的特定实例化的 typedef。 std::mt19937 是经过验证的伪随机数生成器。模板可以用产生不是特别好的引擎的值来实例化,所以大多数人应该坚持std::mt19937
【解决方案2】:

&lt;random&gt; 标准库的全部意义在于将分布与随机数生成器分开提供一个随机数生成器来生成均匀整数,而分布负责将该随机、均匀的整数序列转换为所需分布的样本。

幸运的是,&lt;random&gt; 库还包含一组随机数生成器。 Mersenne Twister (std::mt19937) 尤其是相对较好的(即速度快且统计质量高)。

(您还需要为生成器提供一个种子。)

【讨论】:

    【解决方案3】:

    我知道帖子很旧,但是,我希望我的回答是有益的。我使用normal_distribution 为传感器生成高斯噪声。这有利于模拟传感器。例如,假设您有一个传感器,可以为您提供 2D 机器人的位置。每次移动机器人时,传感器都会为您提供机器人位置的一些读数。在 OpenGL 中,您可以模拟此示例。例如,您可以跟踪鼠标的位置,并在鼠标的真实位置上添加一些高斯噪声。在这种情况下,您有一个跟踪鼠标位置的传感器,但是由于噪声,它具有不确定性。

    【讨论】:

      猜你喜欢
      • 2011-03-26
      • 2017-07-13
      • 1970-01-01
      • 2011-02-27
      • 2018-11-21
      • 2013-04-13
      • 1970-01-01
      • 2010-11-10
      • 2020-11-28
      相关资源
      最近更新 更多