見出し画像

🎲ビュフォンの針をp5.jsで再現できませんか?

ビュフォンの針問題は確率論の有名な問題で、長さの針を床に描かれた平行線の間に無作為に投げたときに、針が線を横切る確率を計算することにより、円周率(π)の近似値を求めることができます。

この問題をp5.jsで再現するには、以下のステップを実装する必要があります:

  1. 平行線を描画する: 床に描かれた平行線を描画します。これらの線は等間隔であり、間隔は針の長さと同じか、それ以上である必要があります。

  2. 針をランダムに投げる: 針をランダムに生成し、その位置(中心のx,y座標)と角度をランダムに設定します。

  3. 針が線を横切るか判定する: 針がどの平行線も横切っているかどうかを判定します。

  4. πの近似値を計算する: 針が線を横切る確率を用いて、πの近似値を計算します。ビュフォンの針問題の理論によると、この確率は2L/(πT)で与えられます(Lは針の長さ、Tは線の間隔)。

これを実装するための基本的なp5.jsのコードスケッチを書いてみましょう。

以下のコードはp5.jsを使用してビュフォンの針問題をシミュレーションするためのものです。このシミュレーションでは、画面上に等間隔の平行線を描き、ランダムに針を投げて、それが線を横切るかどうかを判定します。シミュレーションを通じて、πの近似値を計算します。

// Buffon's Needle simulation parameters
let needleLength = 100;
let lineSpacing = 100;
let count = 0; // Count of needles crossing a line
let total = 0; // Total needles thrown

function setup() {
  createCanvas(400, 400);
  background(255);
  drawLines();
}

function drawLines() {
  for (let i = 0; i < width; i += lineSpacing) {
    stroke(0);
    line(i, 0, i, height);
  }
}

function throwNeedle() {
  // Needle center
  let x = random(width);
  let y = random(height);
  
  // Needle angle
  let angle = random(TWO_PI);
  
  // Needle endpoints
  let x1 = x + (needleLength / 2) * cos(angle);
  let y1 = y + (needleLength / 2) * sin(angle);
  let x2 = x - (needleLength / 2) * cos(angle);
  let y2 = y - (needleLength / 2) * sin(angle);
  
  // Check if needle crosses a line
  let crossesLine = false;
  for (let i = 0; i < width; i += lineSpacing) {
    if ((x1 < i && x2 > i) || (x1 > i && x2 < i)) {
      crossesLine = true;
      break;
    }
  }
  
  // Draw needle
  if (crossesLine) {
    stroke(255, 0, 0); // Red if crossing a line
    count++;
  } else {
    stroke(0, 0, 255); // Blue if not
  }
  line(x1, y1, x2, y2);
  
  // Update total needles thrown
  total++;
}

function draw() {
  if (total < 1000) { // Change this number for more or fewer needles
    throwNeedle();
  } else {
    noLoop(); // Stop drawing once we reach the total
    let probability = count / total;
    let piEstimate = (2 * needleLength) / (probability * lineSpacing);
    console.log('Pi Estimate:', piEstimate);
  }
}

function mouseClicked() {
  total = 0; // Reset total needles thrown
  count = 0; // Reset count of needles crossing a line
  clear();
  background(255);
  drawLines();
  loop();
}



ビュフォンの針とは、確率論および統計学における有名な問題で、フランスの自然科学者ジョルジュ=ルイ・ルクレール・ド・ビュフォンにちなんで名付けられました。この問題は、数学的な確率を用いて円周率の近似値を求める方法の一つです。
ラップのスタイルで説明するなら、こんな感じになります:


Yo、聞いてくれ、このビュフォンの針の話、 数学のトリック、ちょっとした魔法みたいなもんだ、さぁ。
平面上に直線を引いて、間隔一定で、 針を落とすゲーム、始めようじゃないか。
針の長さ、直線の間隔、これがキー、 確率を使って、円周率を見つけ出すんだ。
針が線を越える確率、それを計算して、 2倍して針の長さを割り、直線の間隔で掛けるんだ。
何度も試せば試すほど、真実に近づく、 円周率π、3.14... それが見えてくる。
ビュフォンの針、ただの遊びじゃない、 数学の美しさ、自然の法則を見せてくれるんだ。
数学者の夢、科学者のロマン、 確率と統計で、宇宙の真理に一歩近づく。

お願い致します