1

ここに投稿するのはこれが初めてです。Mathematica スタディ ガイドからの質問について、助けていただければ幸いです。私の質問は次のとおりです。酔っ払いがランダムに前、後ろ、左、または右に 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]

ただし、グラフを作成する必要がある 2 番目の部分については助けが必要です。2番目の部分での私の試みは次のとおりです。

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

グラフは表示されますが、正しくないようです。これについて何か助けていただければ幸いです。

4

2 に答える 2

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 に答える
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]]

これにより、約1桁の速度向上が見られるはずです。

Timing[RandomWalkPacked[10^7];]

パックド配列の詳細については、Developer/ref/ToPackedArray を参照するか、 Mathematica によるプログラミング: 入門 のMathematica プログラムの最適化に関する第 12 章を参照してください。

于 2013-06-02T22:28:50.230 に答える