Random Walker 隨機漫步模擬

都會阿嬤

阿嬤碎碎念

在這篇文章中,我們將學會如何在二維平面上,模擬一個 Random Walker (隨機漫步者)。我們可以藉著操縱一個物體的位置 (Position),來讓他在平面上到處亂走。我們將學會向量、隨機、位置等概念。

Vector 向量

向量 (Vector) 是一個數學工具,時常用於數學、物理中。向量具有兩個特徵:

  • 方向
  • 長度

因此我們可以很自然的用向量來表示一個物體或一個粒子的速度 (Velocity)、加速度(Acceleration)、動量 (Momentum) 等等,這些性質我們會在未來的文章中使用到。當然,也可以用向量來表示一個物體在座標中的位置 (Position)。這篇文章將實做透過改變一個粒子的位置來模擬一個 Random Walker。

Random Walker 隨機漫步模擬

我們先定義一個 class Walker,並將他的位置以一個向量表示。每次 update 的時候都讓他的位置的 x 值移動 random(-2, 2), y 值也移動 random(-2, 2)。最後在 show函式內定義如何成現在 Canvas 上。

class Walker {
    constructor(x, y) {
      this.pos = createVector(x, y);
    }
  
    update() {
      this.pos.x = this.pos.x + random(-2, 2);
      this.pos.y = this.pos.y + random(-2, 2);
    }
  
    show() {
      stroke(255, 100);
      strokeWeight(2);
      point(this.pos.x, this.pos.y);
    }
}

因為向量的疊加性,以下的程式碼可以理解成 :

  • 粒子的位置的 x 分量經過一個 timestep 後,增加了從 -2 到 2 中間的一個隨機值。
  • 粒子的位置的 y 分量經過一個 timestep 後,增加了從 -2 到 2 中間的一個隨機值。
    update() {
      this.pos.x = this.pos.x + random(-2, 2);
      this.pos.y = this.pos.y + random(-2, 2);
    }

Random Walker 模擬:

其實我們可以觀察到,因為每個 timestep,移動的期望值其實都是 0,因此我們可以假定粒子其實會在畫面的中間附近移動,不會偏離太多。讀者可以試試看調整不同 random 函數中的值,觀察粒子移動的軌跡如何改變。

程式碼

可以從以下連結線上執行看看程式碼:

Random Walker 程式碼

參考

本篇文章主要參考 The Nature of Code ,以及作者的 Youtube:

發表迴響