決定ルーレット
ルーレットに決めてもらいましょう、優柔不断さよさらば
記録がありません — 回してみよう!
決定ルーレットとは?
決定ルーレットは、あなたの決定を助ける楽しいツールです。複数の選択肢で迷っている時、すべての選択肢をルーレットに入力し、スピンをクリックして、偶然に決定してもらいましょう。
よくある使用シーン:
- 今日何を食べる?レストランの候補をルーレットに追加
- 週末どこに行く?行き先をルーレットに追加
- 何の映画を見る?映画の候補をルーレットに追加
- チーム活動の選択、公平な決定
使い方
使い方
- 入力ボックスに選択肢名を入力し、Enterキーまたは「追加」をクリックしてください
- 複数の選択肢を追加できます(最大15個、各選択肢は最大20文字)
- 中央の「SPIN」ボタンをクリックするとホイールが回転します
- ホイールが停止するまで待ち、ランダムに選ばれた結果を確認してください
公平性のヒント
- 回転前にも誰もが読み取りやすいよう、選択肢は短く、長さを揃えておきましょう。
- 重要な決定では、回転前に選択肢リストを確定させ、不利な結果を見てから内容を変更しないようにしましょう。
利用シーン
仕組み
ルーレットは決定論的ランダム抽選を重ねた Canvas 2D 描画で構成されています。各スライスは ctx.beginPath()、ctx.moveTo(cx, cy)、ctx.arc(cx, cy, r, startAngle, endAngle)、ctx.fill() でレンダリングされ、N 個の均等な選択肢はそれぞれ 2π/N ラジアンの弧を持ちます。15 スライスの場合は各 24 度で、入力が 15 個に制限されているのはラベルの可読性を保つためです。当選スライスはアニメーションの前に決定されます。32 ビット符号なし整数を crypto.getRandomValues(new Uint32Array(1))[0] で生成し、N の剰余を取ったものが答えとなります。アニメーションは fullSpins * 2π + (2π - winnerIndex * sliceAngle - sliceAngle / 2) という目標回転角を計算し、キャンバス上部のポインタが選ばれたスライスの中央に向くようにします。requestAnimationFrame 内で easeOutCubic の f(t) = 1 - (1-t)^3 や easeOutBack などのイージングカーブで補間し、物理的なルーレットが減速する動きを模倣します。crypto.getRandomValues は Web Crypto API で規定された CSPRNG であり、OS のエントロピープールからシードされるため、Math.random とは異なりページの状態を読むことで結果を予測することはできません。加重版は長さ N の累積確率配列を構築し、O(log N) の二分探索で乱数値をマッピングします。出力はすべて視覚的で揮発性のものであり、何もログに記録されないため、監査証跡(タイムスタンプ、選択肢リスト、スクリーンショット)はページが更新される前に外部で取得する必要があります。
- Canvas 描画: 各スライスは ctx.arc(cx, cy, r, startAngle, endAngle) で sliceAngle = 2π / N。15 選択肢で各 24 度の弧となり、これが実用的な可読性の上限。
- 当選者の選定は crypto.getRandomValues(new Uint32Array(1))[0] % N を使用。Web Crypto CSPRNG で OS エントロピからシードされ、公平な単発抽選に適するが、再生可能な抽選には不向き(監査証跡なし)。
- アニメーションはディスプレイのリフレッシュレート(通常 60 Hz)の requestAnimationFrame で実行され、easeOutCubic の f(t) = 1 - (1-t)^3 や easeOutBack でわずかなオーバーシュートを表現。カーブは装飾であり、当選者はすでに決定済み。
- 最終回転角は targetRotation = fullSpins * 2π + (2π - winnerIndex * sliceAngle - sliceAngle / 2) で、上部ポインタがスライスの中央に位置するようになる。
- 加重オプションモードでは重みのプレフィックスサム配列を構築し、二分探索で一様乱数をスライスにマッピング(O(log N))。逆 CDF サンプリングと等価。
- N が 15 以下で抽選範囲が 2^32 値の場合はモジュロバイアスが無視できる(バイアス ≈ N / (2 * 2^32) ≈ 1.7×10^-9)。 rejection-sampling ループは不要。
- 各スピンは独立同一分布。連続で同じ選択肢が選ばれてもそれは正しい一様動作でありバグではない。スピン間の重複排除には外部記録が必要。
使用例
ランチ選び
選択肢: ピザ、寿司、バーガー、タコス、サラダ → 回す → 結果: 寿司チームアクティビティ
選択肢: ボウリング、カラオケ、脱出ゲーム、ミニゴルフ → 回す → 結果: 脱出ゲーム映画ナイト
選択肢: アクション、コメディ、ホラー、恋愛、SF → 回す → 結果: コメディよくある質問
ホイールの回転は本当にランダムですか?
はい。選ばれるセグメントは crypto.getRandomValues によって決定されたあと、ホイールがそのセグメントに止まるようアニメーションします。視覚的な回転は演出にすぎず、結果は最初に決まっています。各回転は過去の結果から独立しています。
すべてのセグメントは等確率ですか?
はい。各選択肢は同じサイズのスライスを得て、各スライスの確率も等しくなります。重み付けや偏りのあるモードはなく、すべての選択肢が同じ確率で選ばれます。
回転アニメーションは結果に影響しますか?
いいえ。アニメーションは演出です。結果が先に計算され、その後ホイールがそれを示すように回転します。途中でアニメーションを停止しても、選ばれるセグメントは変わりません。
ホイールの設定をセッションをまたいで保存できますか?
いいえ。選択肢は現在のセッション中のみ保持されます。タブを閉じたり更新したりするとリストは失われます。再利用する必要がある場合は、閉じる前に選択肢をコピーしておいてください。
重要な決定に使ってもよいですか?
ランチや発表順、ドラフトなど、どの選択肢でも受け入れ可能で、見える形のランダム性が遺恨を避けてくれる、低リスクなグループの選択にお使いください。選択肢間で結果が大きく異なるような決定を委ねるのは避けてください。ホイールはトレードオフを評価できません。
同じ選択肢が連続で選ばれることがあるのはなぜですか?
各回転は独立しています。選択肢が 3 つの場合、同じ選択肢が連続で 2 回選ばれる確率は 1/3 ≈ 33%、10 個の場合は 10% です。繰り返しは奇妙に感じるかもしれませんが、本物の乱数選択では数学的に予想される結果です。
選択肢のリストはアップロードされますか?
いいえ。ホイールは完全にブラウザ内で動作します。オプトインすればローカルに保存されますが、サーバーには一切送信されません。