iT邦幫忙

DAY 4
1

用程式描繪世界 - 閱讀The Nature of Code系列 第 4

[Day4] - 隨機移動與Uniform Distribution

  • 分享至 

  • xImage
  •  

上一篇作出了一個基本的Random Walks的物件,並讓它在螢幕上動起來,但只有實現了往四個方向,上、下、左、右,但螢幕上每個像素都有八個相鄰的像素,如下圖

有八個方向可以移動,加上原地不動就有九個可選的方向,所以我們可以將原本的Random Walks做一些改進。

將X與Y軸拆開來看的話,X軸的移動有3個選擇,往左移動1個像素、不動、往右移動1個像素,Y軸同樣有3個選擇,計算X與Y軸的所有組合,剛剛好就是9種,依照這個想法,作出如下改進

step(){
  stepx = int(random(3)) - 1; //可能產生 -1, 0 or 1
  stepy = int(random(3)) - 1;
  x += stepx;
  y += stepy;
}

或者也可以改成使用浮點數,random(-1, 1)會產生由-1.0 ~ 1.0的任意隨機數值

void step() {
  float stepx = random(-1, 1);
  float stepy = random(-1, 1);
  x += stepx;
  y += stepy;
}

包括上一篇與這一篇,關於Random walks的變化與改進,要說明的只是機率這件事,Walker往任何方向走的機率都是一樣的,4個方向,任何一個方向的機率是 25% (1/4),9個方向則是 11.1% (1/9)

這可以解釋random()這個方法在Processing中的運作方式,稱為均勻分佈(Uniform Distribution),在範圍內每個值出現的機率相等。書中有一個範例去做驗證,

網址在此 http://natureofcode.com/book/introduction/#canvas1

int[] randomCounts;

void setup() {
  size(640,240);
  randomCounts = new int[20];
}

void draw() {
  background(255);

  // Pick a random number and increase the count.
  int index = int(random(randomCounts.length));
  randomCounts[index]++;

  stroke(0);
  fill(175);
  int w = width/randomCounts.length;
  // Graphing the results
  for (int x = 0; x < randomCounts.length; x++) {
    rect(x*w,height-randomCounts[x],w-1,randomCounts[x]);
  }
}

可以看見個每個長條大致上會平均增長,雖然長條之間會有細微的偏差,但隨著時間會越來越平均。

下一篇會介紹非均勻分佈(Non-Uniform Distributions),當粒子在空氣中運動的時候,雖然是隨機運動,但卻可能因為風的影響而趨向往某個方向移動,那要如何模擬這個情況呢?


上一篇
[Day3] - 模擬隨機移動
下一篇
[Day5] - Non-Uniform Distribution
系列文
用程式描繪世界 - 閱讀The Nature of Code9
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言