1

这是我第一次在这里发帖。对于我的数学学习指南中的一个问题,我真的很感激。我的问题是:假设一个醉汉随机向前、向后、向左或向右移动一个单位多次。创建一个坐标列表 {{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]]]]

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

4

2 回答 2

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 章。

于 2013-06-02T22:28:50.230 回答
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]]]]
于 2013-06-02T15:24:41.783 回答