p5.js 関数リファレンス:randomGaussian()

2025年10月24日金曜日

p5.js リファレンス

t f B! P L
タイトル画像

様々な関数の使い方をおさらいし、作例コードを書くことで、自分の知識の定着を図っています。

今回は、randomGaussian() 関数の解説を行い、サンプルコードを書くことで、その使い方を学びます。p5.js は、安定版のバージョン 1.11.11 を使用しています。

内容については正確を期していますが、お気づきの点があればご指摘いただけると幸いです。

 

randomGaussian() 関数の説明と使い方

randomGaussian() | p5.js 公式リファレンス

説明

ガウス分布(正規分布)に適合する値の乱数を返す関数です。

正規分布 | Wikipedia

正規分布曲線をグラフで表すと、釣鐘状の曲線(ベル・カーブ)に見えます。正規分布の値は平均値の周りに集まります。標準偏差は正規分布の値の広がりを表します。

デフォルトでは、randomGaussian() はスケッチを実行するたびに異なる結果を生成します。randomSeed() 関数を使用すると、スケッチを実行するたびに同じ数列を生成できます。

randomGaussian() が返す値に最小値や最大値はありません。平均から遠い値が返る可能性は非常に低く、近い値が返る可能性は非常に高くなります。

 

書き方

randomGaussian([平均値], [標準偏差])

パラメータ

  • 平均値: 平均値を数値で指定します。指定は任意です。
  • 標準偏差: 標準偏差を数値で指定します。指定は任意です。

パラメータなしの randomGaussian() は、平均が 0、標準偏差が 1 の値を返します。
パラメータを 1 つ指定した randomGaussian() は、渡された引数を平均と解釈します。標準偏差は 1 です。
パラメータを 2 つ指定した randomGaussian() は、渡された最初の引数を平均と解釈し、2 番目の引数を標準偏差と解釈します。

 

返り値

数値: 乱数

前述のとおり、ここで返る乱数値に最小値や最大値はありませんが、ガウス分布の特性として高い確率で平均値付近の値が返ります。

  • 「平均値 - 標準偏差」から「平均値 + 標準偏差」の間の値になる確率が 68.27%
  • 「平均値 - 標準偏差 * 2」から「平均値 + 標準偏差 * 2」の間の値になる確率が 95.45%
  • 「平均値 - 標準偏差 * 3」から「平均値 + 標準偏差 * 3」の間の値になる確率が 99.73%

 

p5.js 公式リファレンスのコード例の補足


function setup() {
  createCanvas(100, 100);
  background(200);
}

function draw() {
  // Style the circles.
  noStroke();
  fill(0, 10);

  // Uniform distribution between 0 and 100.
  let x = random(100);
  let y = 25;
  circle(x, y, 5);

  // Gaussian distribution with a mean of 50 and sd of 1.
  x = randomGaussian(50);
  y = 50;
  circle(x, y, 5);

  // Gaussian distribution with a mean of 50 and sd of 10.
  x = randomGaussian(50, 10);
  y = 75;
  circle(x, y, 5);
}

x 方向にランダムな位置をとる点を複数個描画して、その分布を見せるものです。

  • 上段が普通の random()
  • 真ん中は randomGaussian(50) 「平均値 = 50 標準偏差 = 1」、パラメータが 1つなので標準偏差はデフォルト値の 1 になります。
  • 下段は randomGaussian(50, 10) 「平均値 = 50 標準偏差 = 10」

点には fill(0, 10) で透明度を持たせ、ある位置に描画される確率の高低を濃度の濃淡で表しています。

 

randomGaussian() を使った作例

螺旋を点描する際の座標を randomGaussian() を使ってずらし、ぼんやりとした渦を描いてみました。


/** 
 * p5.js randomGaussian() 関数の作例
 * 螺旋を正規分布でボンヤリ描画し、標準偏差を変化させてアニメーション
 * 
 * @author @deconbatch
 * @version 0.1
 * @license CC0
 * p5.js 1.11.11
 * created 2025.10.23
 */

const CANVAS_SIZE       = 360;
const ANIM_SEC          = 6;
const FRAME_RATE        = 24;
const FRAME_NUM_MAX     = FRAME_RATE * ANIM_SEC;
const THETA_DIV_NUM     = 100;
const SAMPLE_NUM        = 40;
const STD_RATIO_MAX     = 0.3;
const THETA_RND_FACTOR  = 0.5;
const SPIRAL_TURNS_BASE = 5;
const SPIRAL_SIZE_RATIO = 0.7;

function setup() {
  createCanvas(CANVAS_SIZE, CANVAS_SIZE);
  frameRate(FRAME_RATE);
  stroke("MidnightBlue");
  strokeWeight(2);
}

function draw() {

  const frameCnt  = frameCount % FRAME_NUM_MAX;
  const thetaMax  = PI * (SPIRAL_TURNS_BASE + frameCnt / FRAME_RATE);
  const thetaStep = thetaMax / THETA_DIV_NUM;
  const stdRatio  = STD_RATIO_MAX * (1.0 - frameCnt / FRAME_NUM_MAX);
  
  background(255);
  translate(CANVAS_SIZE * 0.5, CANVAS_SIZE * 0.5);
  rotate(-10 * PI * frameCnt / FRAME_NUM_MAX);

  for (let t = 0; t < thetaMax; t += thetaStep) {
    let r = SPIRAL_SIZE_RATIO * CANVAS_SIZE * t / thetaMax;
    for (let i = 0; i < SAMPLE_NUM; i++) {
      let tRG = t + thetaStep * random(THETA_RND_FACTOR);
      let rRG = randomGaussian(r, r * stdRatio);
      point(rRG * cos(tRG), rRG * sin(tRG));
    }
  }

}

螺旋の弧に沿った側のズレ(角度のズレ)は random() で、弧と直角方向のズレ(半径のズレ)を randomGaussian() で実装しました。時間経過に従って標準偏差を小さくして「ぼんやり」→「くっきり」描画しています。


 let tRG = t + thetaStep * random(THETA_RND_FACTOR);
 let rRG = randomGaussian(r, r * stdRatio);
 

装飾として、時間経過に従って螺旋の巻き数を増やし、


 const thetaMax  = PI * (SPIRAL_TURNS_BASE + frameCnt / FRAME_RATE);
 

全体に回転を加えてみました。


 rotate(-10 * PI * frameCnt / FRAME_NUM_MAX);
 

弧方向のズレ具合を調整すると表情の違った絵になります。


 const THETA_RND_FACTOR	= 0.1;
 
放射状の線で描かれた螺旋


 const THETA_RND_FACTOR	= 1.0;
 
ぼんやりした太い線で描かれた螺旋

描画する点を増やしてみると、より正規分布らしさが出るでしょう。


 const THETA_DIV_NUM	= 500;
 const SAMPLE_NUM	= 100;
 strokeWeight(0.5)
 
よりぼんやりした線で描かれた螺旋

 

QooQ