C++ 随机游动布朗运动

C++ 随机游动布朗运动,c++,random,C++,Random,我被分配了创建一个简单控制台应用程序的项目。在二维平面上模拟布朗运动。我没有得到太多关于如何做到这一点的信息(我希望这是一个非常受欢迎的作业,以便我能有所了解),只是它依赖于随机数生成。我研究了一点布朗运动,看到了一些看起来很复杂的公式,但根据描述,它们似乎必须在一定的数字间隔内随机移动。有人能澄清一下吗?我是要创建一个程序,在一个间隔内连续创建一个随机数,然后修改粒子“x”和“y”坐标,还是还有更多 谢谢你的帮助。布朗运动是随机空气分子撞击小粒子的结果。由于一组随机力的总和不可能精确为0,而且

我被分配了创建一个简单控制台应用程序的项目。在二维平面上模拟布朗运动。我没有得到太多关于如何做到这一点的信息(我希望这是一个非常受欢迎的作业,以便我能有所了解),只是它依赖于随机数生成。我研究了一点布朗运动,看到了一些看起来很复杂的公式,但根据描述,它们似乎必须在一定的数字间隔内随机移动。有人能澄清一下吗?我是要创建一个程序,在一个间隔内连续创建一个随机数,然后修改粒子“x”和“y”坐标,还是还有更多


谢谢你的帮助。

布朗运动是随机空气分子撞击小粒子的结果。由于一组随机力的总和不可能精确为0,而且粒子的质量很小,它似乎在抖动,因此出现布朗运动。所以你得到一个看起来是随机的运动,但不是均匀的

模拟它的愚蠢方法是,获得数百个空气分子的方向的均匀分布和动量的高斯分布,将碰撞应用于一个粒子,然后得到总和。这样做很多次,你会得到布朗型运动。(单个空气分子的平均动量取决于温度,空气分子的数量取决于压力。)


请注意,生成的运动不是高斯分布,而是高斯分布中许多样本的总和。不知道它叫什么。

请记住,随机运动不是“均匀”的,但是如果你绘制运动频率与运动距离的关系图,你会发现大多数是短的,一些是长的,还有一些是很长的,造成了类似于指数下降的现象

我记不起运动观察到的统计曲线,但你可能会发现,然后你需要制作一个随机数生成器,生成值来拟合该曲线


我要做的是用这个RNG计算距离,然后用一个均匀的RNG计算角度,从0到2*pi,并使运动极性。你可以分别计算一个随机X和一个随机Y,但我不确定你会得到相同的分布。

是的,你只需要在每个时间步将随机数添加到
X
Y
坐标中,如下所示:

int x=0, y=0;

for (int t=0; t<N; t++) {
    x += distribution(gen);
    y += distribution(gen);
    display(x, y);
}
intx=0,y=0;

对于(int t=0;t,你的问题非常不适定。这几乎肯定不是你的错,因为你的导师应该向你指出,正确实现布朗运动需要对问题域进行大量非常复杂的说明和分析,甚至在你开始编码之前

除非你修过测量理论的相关课程,否则布朗运动的精确定义对你来说可能是不透明的。然而,网上有大量的资源对Ito过程进行了充分的描述(布朗运动就是一个例子)

如果你有兴趣对这样的过程编码,这里有一个不错的技巧。在某个阶段你需要生成随机数。几乎可以肯定的是,你会对从普通分布中产生绘图感兴趣。谢天谢地,有一些很棒的方法可以用于C++程序员。我最喜欢使用Boost。随机库(或C++11中的相关库)。最聪明的策略是使用函数对象生成随机变量,可能是使用变量生成器:

#include <iostream>
#include <vector>
using namespace std;

#include <boost/random/mersenne_twister.hpp>
#include <boost/random/normal_distribution.hpp>
#include <boost/random/variate_generator.hpp>

int main()
{
  // Some typedefs to help keep the code clean
  // Always a good idea when using Boost!
  typedef boost::mt19937                                      T_base_prng;
  typedef boost::normal_distribution<>                        T_norm_varg;
  typedef boost::variate_generator<T_base_prng&, T_norm_dist> T_norm_varg;

  unsigned int base_seed = 42;  // Seed for the base pseudo-random number generator
  double       mean      = 0.0; // Mean of the normal distribution
  double       stdev     = 1.0; // Standard deviation of the normal distribution
  T_base_prng  base_prng(base_seed); // Base PRNG
  T_norm_dist  norm_dist(mean, stdev); // Normal distribution
  T_norm_varg  norm_varg(base_prng, norm_dist); // Variate generator

  // Generate 1000 draws from a standard normal distribution
  vector<double> drawVec(1000);
  for (vector<double>::iterator iter = drawVec.begin(); 
       iter != drawVec.end(); ++iter)
  {
    *iter = norm_varg();
  }

  // More stuff...


  return 0;
}
#包括
#包括
使用名称空间std;
#包括
#包括
#包括
int main()
{
//一些typedef可以帮助保持代码干净
//使用Boost时,这始终是一个好主意!
typedef boost::mt19937 T_base_prng;
typedef boost::正态分布T_norm_varg;
typedef boost::变量发生器T_norm_varg;
无符号int base_seed=42;//基伪随机数生成器的种子
双平均值=0.0;//正态分布的平均值
double stdev=1.0;//正态分布的标准偏差
T_base_prng base_prng(base_seed);//base prng
T_norm_dist norm_dist(平均值,stdev);//正态分布
T_norm_varg norm_varg(base_prng,norm_dist);//变量生成器
//从标准正态分布生成1000个绘图
向量drawVec(1000);
for(vector::iterator iter=drawVec.begin();
iter!=drawVec.end();++iter)
{
*iter=norm_varg();
}
//更多的东西。。。
返回0;
}

一旦你掌握了布朗运动是什么,那么使用Boost.Random中的功能构造一些示例应该是很简单的。

具体来说,你尝试过什么或者有什么问题?这听起来像是要问你的助教。它是全面的还是简单得多?你是否必须将程序从Random迁移在下一次迭代中走到布朗运动?是的,bdares具有分布——高斯分布。(自1972年以来就没有考虑过这一点。)有RNG可以直接计算高斯随机数(或者至少在1972年有)C++具有一个高斯分布,用于随机数库。它被称为“代码> STD::NojiGrimeDistabase<代码>。请注意,我们希望避免直接响应问题而提供预编码代码。(这并不是说这是现成的,但至少bdares和Hot Clicks进一步提出了一个问题,即我认为它们更适合选择哪种发行版。)这是不正确的。布朗过程在一个区间内移动的距离服从高斯分布。@queue:只有当N非常大时,它在统计上才是正确的。对于较小的
N
,您可以判断它是否是布朗运动。在示例中,使用标准库可能比使用boost更好。人和不应该是吗y样品