home processing download documents tutorial python tutorial gallery source about
 チュートリアル (トピック一覧へ戻る)

乱数

     乱数

iGeoではIRandomクラス(またはその別名クラスのIRandクラス)には 乱数の生成と利用のためのメソッドが用意されています。
IRandom.get()は0.0から1.0の間の浮動点小数値(double)をランダムに返します。

import processing.opengl.*;
import igeo.*;

size( 480, 360, IG.GL );

int num = 100;

IVec[] cpts1 = new IVec[num];
for(int i=0; i < num; i++){
  cpts1[i] = new IVec(i*2-50, 40, IRandom.get()*10);
}
new ICurve(cpts1).clr(1.,0,0);

IVec[][] cpts2 = new IVec[num][2];
for(int i=0; i < num; i++){
  cpts2[i][0] =
    new IVec(i*2-50,-30, IRandom.get()*5*(sin(i*0.2)+1) );
  cpts2[i][1] =
    new IVec(i*2-50, 30, IRandom.get()*5*(sin(i*0.2)+1) );
}
new ISurface(cpts2);

乱数の生成する範囲はメソッドで指定することもできます。 整数の乱数を生成するには、IRandom.getInt(int,int)を用います。 引数には最小と最大の乱数の範囲を指定します。 同様に、IRandom.get(double,double)では2つの引数で範囲を指定し、 double型の乱数を返します。

import processing.opengl.*;
import igeo.*;

size( 480, 360, IG.GL );

for(int i=0; i < 40; i++){

  int ynum = IRandom.getInt(10, 40);
  for(int j=0; j < ynum; j++){

    int znum = IRandom.getInt(20-j, 40-j);
    for(int k=0; k < znum; k++){

      double size = IRandom.get(2.5, 10.0);
      double x=i*10, y=j*10, z=k*2;
      new ISurface(x, y, z, x+size, y, z,
                   x+size, y+size, z, x, y+size, z)
                   .clr(k*0.05, k*0.05, 0);
    }
  }
}


     ランダム点

IRandom.pt()メソッドを用いて ランダムな座標値をもつIVecの値を生成できます。 乱数の範囲はX,Y,Z各々の最大、最小で指定します。 メソッドの引数にはこれら6つの数値を指定します。

import processing.opengl.*;
import igeo.*;

size( 480, 360, IG.GL );

for(int i=0; i < 1000; i++ ){
  IVec pos = IRandom.pt(-70,-70,-30,70,70,30);
  new IPoint(pos);
}

乱数のシードを設定したい場合はIRandom.init(long) を利用します。 また、実行のたびに異なる乱数を生成したい場合は、 IRandom.initByTime()メソッドを用います。

import processing.opengl.*;
import igeo.*;

size( 480, 360, IG.GL );

IRandom.initByTime();
IVec[] pts = new IVec[100];
for(int i=0; i < pts.length; i++ ){
  pts[i] = IRandom.pt(-90,-90,-60,90,90,60);
}
new ICurve(pts,3).clr(1.,.3,0);

IRandom.initByTime()を用いると 毎回異なる乱数の振る舞いになりますが、 もしもその中で気に入ったものがあっても、同じ振る舞いが起きることはほぼないので、 振る舞いを再現したい場合はIRandom.init(long)メソッドを 毎回異なるシード数で実行し、気に入ったものがあれば同じシード数をまた設定 することで再現されます。


     ランダム色

IRandom.clr()メソッドを用いるとランダムな色を生成することができます。 IRandom.gray()メソッドはランダムなグレースケールの色を生成します。

import processing.opengl.*;
import igeo.*;

size( 480, 360, IG.GL );

for(int i=0; i < 1000; i++ ){
  new IPoint(IRandom.pt(-70,-70,-30,0,70,30))
  .clr(IRandom.clr());
  new IPoint(IRandom.pt(0,-70,-30,70,70,30))
  .clr(IRandom.gray());
}

以下はランダムな点で生成された三角形の面にランダムな色を設定した例です。

import processing.opengl.*;
import igeo.*;

size( 480, 360, IG.GL );

IVec pt = new IVec(30,30,0);

for(int i=0; i < 100; i++){
  new ISurface(IRandom.pt(-50,-50,0,0,0,50),
               IRandom.pt(-50,-50,0,0,0,50),pt)
               .clr(IRandom.clr());
}

     確率的条件分岐

IRandom.percent()メソッド (またはその短いかたちのIRand.pct()) とif条件分岐を組み合わせると、 確率的に、パーセンテージを用いて条件を適用することができます。

import processing.opengl.*;
import igeo.*;

size( 480, 360, IG.GL );

for(int i=0; i < 50; i++){
  for(int j=0; j < 50; j++){
    double x = i*4-100, y = j*4-100;
    // 50% probability to be executed
    if(IRandom.percent(50)){
      new ISurface(x,y,0,x+2,y,0,x+2,y,50).clr(1.,1.,1.);
    }
    // 50% of the rest ( = 25%)
    else if(IRandom.percent(50)){
      new ISurface(x,y,0,x+2,y,0,x+2,y,20).clr(0,1.,1.);
    }
    // 50% of the rest of the rest ( = 12.5%)
    else if(IRandom.percent(50)){
      new ISurface(x,y,0,x+2,y,0,x+2,y,10).clr(1.,0,0);
    }
  }
}


(トピック一覧へ戻る)

HOME
FOR PROCESSING
DOWNLOAD
DOCUMENTS
TUTORIALS (Java / Python)
GALLERY
SOURCE CODE(GitHub)
PRIVACY POLICY
ABOUT/CONTACT