数学の面白さを「さわって確かめる」ための、依存ゼロ・1ファイル完結のインタラクティブサイトです。
ビルド不要、index.html をブラウザで開くだけで動きます。
| テーマ | さわれること | |
|---|---|---|
| 扉 | ウラム螺旋 | 1, 2, 3, … を渦巻きに並べ素数だけ赤丸。斜めの筋が浮かぶ様子をリアルタイム描画 |
| 問一 | コラッツ予想 | 好きな正整数を入力 → 1 に落ちるまでの軌道を対数スケールで描画(最高到達点・ステップ数つき) |
| 問二 | 1次元セルオートマトン | Rule 30 / 90 / 110 / 184 を切り替え。最上段クリックで初期状態(種)を編集 |
| 問三 | モンテカルロ法で π | 点の雨を降らせて円内率 ×4 が 3.14159… に収束する様子を観察 |
| 問四 | モンティ・ホール問題 | 実際にプレイ+100回自動試行で「そのまま 1/3 vs 乗り換え 2/3」を集計で体感 |
- 生成: Claude(Anthropic)との対話で「数学の面白さを伝えるインタラクティブなサイト」として一発生成。デザインは日本の数学ノート(方眼紙+赤ペン+試験問題の「問」番号)をモチーフに、Shippori Mincho / Zen Kaku Gothic New / IBM Plex Mono の3書体構成。
- バグ報告(人間によるQA): 公開前の動作確認で2件のバグを発見・報告。
- 修正: 以下の2件を修正し、シミュレーションで検証済み。
① モンティ・ホールが無反応(ReferenceError)
// Before — スペース欠落により「const候補」が単一の識別子として解釈される
const候補=[0,1,2].filter(d=>d!==picked && d!==prize);
// After
const cand=[0,1,2].filter(d=>d!==picked && d!==prize);JS の識別子には日本語が使えるため const候補 は構文的には合法(node --check を通過)。
しかし実体は「未宣言変数 const候補 への代入」であり、"use strict" 下では扉クリック時に
ReferenceError → ゲームが無反応になっていた。構文チェックでは捕まらず、実行して初めて分かる典型例。
② π の推定値に系統誤差(境界判定と撒布範囲の不一致)
// Before — 点は一辺 S の正方形全体に撒くのに、判定円の半径は S/2−1
const x=Math.random()*piSize, y=Math.random()*piSize;
// After — 撒布範囲を判定円に外接する一辺 2r の正方形に一致させる
const x=1+Math.random()*2*r, y=1+Math.random()*2*r;修正前の収束先は π ではなく π(1−2/S)² ≈ 3.11。点をいくら増やしても 3.14159… に届かない 統計揺らぎではないバイアスだった。修正後、200万点のシミュレーションで推定値 3.1417 を確認 (残差は √N オーダーの揺らぎのみ)。
教訓: ①は「LLM はもっともらしく壊れたコードを書く」、②は「見た目が動いていても数学的に 間違っていることがある」。どちらも人間のレビューが収束を救った。
- Vanilla JS + Canvas 2D のみ(フレームワーク・ビルドなし、約27KB)
devicePixelRatio対応の高解像度描画、リサイズ時は再レイアウトprefers-reduced-motion尊重(ウラム螺旋は一括描画に切替)、キーボード操作対応(扉は Enter / Space)- コラッツ列の途中値は 32bit を超えうるため内部計算は BigInt
コードは MIT。フォントは Google Fonts(SIL OFL)を CDN 参照。