前へ 上へ 次へ


Processing入門10


乱数

シミュレーションであれアニメーションであれ、たくさんの点をでたらめな場所に描きたい場合がある。それ以外にもなんらかの意味で「偶然にまかせる」ようにしたい場面も多い。そういうときは「乱数」というものを使う。乱数は読んで字のごとく、でたらめに生成される数のことで、これを発生させるにはrandomという命令を使う。以下のプログラムは100個の円をランダムな位置にランダムな色で描く

 int[] x,y,r,g,b;
 int i;
 x = new int[100]; y = new int[100];
 r = new int[100]; g = new int[100]; b = new int[100];
 size(200,200);
 background(255);
 noStroke();
 for(i=0; i<100; ++i){
   x[i] = int(random(200)); y[i] = int(random(200));
   r[i] = int(random(256)); g[i] = int(random(256)); b[i] = int(random(256));
   fill(r[i],g[i],b[i]);
   ellipse(x[i],y[i],30,30);
 }

このプログラムを実行するたびに違う絵が描かれる。以下の三つは実行例fig26.jpg

randomという命令は実行するたびに違う数を作る。作られる数の範囲は指定できて、random(200) なら、0から200までの数(少数も含む)が作られる。乱数は float(実数) なので、整数として使うには int 命令が必要

random()

ある範囲の数をランダムに作る。範囲は()内に指定する。たとえば、random(100) は0から100まで(100は含まない)の実数をランダムに発生する。同じ命令が、実行のたびに違う数を発生することに注意

上のプログラムをちょっとだけ変更すると、ランダムな絵をどんどん描き変えていくプログラムができる。以下は毎秒5枚の絵を描く

 int[] x,y,r,g,b;
 
 void setup(){
 x = new int[100]; y = new int[100];
 r = new int[100]; g = new int[100]; b = new int[100];
 size(200,200);
 frameRate(5);
 noStroke();
 }
  
 void draw(){
 int i;
 background(255);
 for(i=0; i<100; ++i){
   x[i] = int(random(200)); y[i] = int(random(200));
   r[i] = int(random(256)); g[i] = int(random(256)); b[i] = int(random(256));
   fill(r[i],g[i],b[i]);
   ellipse(x[i],y[i],30,30);
 }
 }

これまでのプログラムを組み合わせると、最初にでたらめに置いた円が壁に衝突しては跳ね返るようなプログラムも簡単に書ける

 int[] x,y,lr;
 int[] r,g,b;
 void setup()
 {
   int i;
    x = new int[50];  y = new int[50];
    lr = new int[50];
    r = new int[50]; g = new int[50]; b = new int[50];
    size(400,400);
    for(i = 0; i<50; ++i){
    x[i] = int(random(400)); y[i] = int(random(400));
    r[i] = int(random(256)); g[i] = int(random(256)); b[i] = int(random(256));
    lr[i] = int(random(2))*2-1;
   }
   noStroke();
 }
 void draw() 
 { 
   int i;
   background(255);
   for(i = 0; i < 50; ++i){
      x[i] += lr[i];
     if (x[i] == 385) { lr[i] = -1;}
     else if (x[i] == 14) { lr[i] = 1;}
     fill(r[i],g[i],b[i]);
     ellipse(x[i],y[i],30,30);
   }
 }
 

ここでは int(random(2))*2-1; という行がトリッキーだが、常套句なので理解しておこう。random(2) は0以上2未満の数を発生する。命令intはこれの小数部分を切り捨てて整数化するので、int(random(2)) は0または1になる。これを2倍して1を引くので、結果は-1または1になる。このプログラムでは、最初に左右どちらに進むかをこのようにしてランダムに決めている。

int(random(2))*2-1;

1と-1をランダムに発生するための常套句

練習問題

乱数と配列を使って、楽しいアニメーションを作る


前へ 上へ 次へ