Go to the first, previous, next, last section, table of contents.


リスト 練習問題 14 解答「ランダムウォーク」

ある (x,y) 座標にランダムステップ 1歩を加える関数をネストするために、 我々は H V U を使うことを望みます。 関数は少し長いですが、それ以外の点で問題は非常に簡単です。

2:  [0, 0]     1:  [ [    0,       0    ]
1:  50               [  0.4288, -0.1695 ]
    .                [ -0.4787, -0.9027 ]
                     ...

    [0,0] 50       H V U ' <# + [random(2.0)-1, random(2.0)-1]> RET

テキストが薦めたとおり、`< >' の無名関数表記を使って 2つの random 呼出しがネストより先に評価されるないようにしました。

得られたのは [x, y] をサブベクトルとするベクトルであって、 それは Calc の規則によって行列のように振舞います。 この行列を転置して x 行と y 行に分解すると、 グラフ化しやすくなります。

2:  [ 0, 0.4288, -0.4787, ... ]
1:  [ 0, -0.1696, -0.9027, ... ]
    .

    v t  v u  g f

ところでこの場合 xy は完全独立ですから、 xy 座標のリストを作るのも、 直接片方ずつ別々に計算できたはずです。

ランダムウォークの一歩を単位長とするために、 ランダムな方向の sincos が発生する [x, y] が まさに単位長の一歩であることに着目します。 少し精度を下げたくなるけれども、 ネストした新しい関数は実際のところさらに簡潔です。

2:  [0, 0]     1:  [ [    0,      0    ]
1:  50               [  0.1318, 0.9912 ]
    .                [ -0.5965, 0.3061 ]
                     ...

    [0,0] 50   m d  p 6 RET   H V U ' <# + sincos(random(360.0))> RET

v t v u g f シーケンスをもう一度実行すれば、 この新ランダムウォークをグラフ化します。

これらランダムウォーク関数について面白いひねりを入れるなら、 平面上の位置を表すのにベクトルの代りに複素数を使うことでしょう。

最初の例では、`random + random*(0,1)' のような事ができるし、 2番目の例では極座標の複素数がランダムな位相角でつかえます。 (この練習問題は Randal Schwartz によって最初に示唆されました。)


Go to the first, previous, next, last section, table of contents.     利用度数