这是我第一次在这里发帖。我非常感谢来自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]]]]
虽然它给了我一个图表,但它似乎不正确。我真的很感激这方面的一些帮助。
答案 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章。