使用Mathematica绘制随机游走

时间:2013-06-02 10:56:47

标签: wolfram-mathematica

这是我第一次在这里发帖。我非常感谢来自mathematica学习指南的一些问题。我的问题是: 假设一个醉汉随机地向前,向后,向左或向右移动一个单位多次。创建表示其路径的坐标{{x,y} ..}列表,然后将该路径显示为每个步骤的一组线段。 [提示:使用NestList创建坐标列表,使用Partition创建段列表,将Line映射到段列表,然后使用Show [Graphics [list]]显示路径。] 我成功地创建了这个函数:

Clear[x, n]

Randomwalk[n_] :=
  NestList[(# + (-1)^Table[Random[Integer, {0, 1}], {2}]) &, Table[0, {2}], n];

Randomwalk[50]

然而,我需要第二部分的帮助,我需要在其中绘制图形。我在第二部分的尝试如下:

Show[Graphics[Line[Randomwalk[50]]]]

虽然它给了我一个图表,但它似乎不正确。我真的很感激这方面的一些帮助。

2 个答案:

答案 0 :(得分:2)

您可以尝试以下功能

RandomWalk[n_]:=Accumulate[{{1,0},{-1,0},{0,1},{0,-1}}[[RandomInteger[{1,4},n]]]]

其中n是要采取的步骤数。绘图工作正如您所写

Graphics[Line[RandomWalk[200]]]

但是,使用颜色绘图显示了步行的进展情况,如

With[{n=100},
   Graphics[MapIndexed[{Hue[#2[[1]]/(n + 10)], Line[#]} &, 
               Partition[RandomWalk[n], 2, 1]]]]

答案 1 :(得分:2)

不是使用[[RandomInteger [{1,4},n]]]来挑选方向,而是可以使用专为此类操作而设计的RandomChoice:

RandomWalk[n_] := Accumulate[RandomChoice[{{1, 0}, {-1, 0}, {0, 1}, {0, -1}}, n]]

这提供了与使用Part和RandomInteger的方法相同(可能稍快)的速度。但是,如果您正在使用大型步行(比如说n> 10 ^ 6),那么您可能希望通过强制将方向列表作为打包数组来挤出一些速度:

NSEWPacked = Developer`ToPackedArray[{{1, 0}, {-1, 0}, {0, 1}, {0, -1}}]

然后使用压缩数组:

RandomWalkPacked[n_] := Accumulate[RandomChoice[NSEWPacked, n]]

你应该看到一个数量级的加速:

Timing[RandomWalkPacked[10^7];]

有关打包数组的详细信息,请参阅Developer {ref / ToPackedArray或有关在Programming with Mathematica: An Introduction中优化Mathematica程序的第12章。