A two-person method to simulate die rolls (2023)

2025/12/06 4:32

A two-person method to simulate die rolls (2023)

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

概要:
記事では、2 人で行う「フェイクダイス」トリックを紹介しています。プレイヤーは言語的な選択のみで、公正な 6 面サイコロの振りを生成できます。各プレイヤーは角度または時計番号(0–11)を選びます。一方が角度差を最大化し、もう一方が最小化します。正規化された差 δ∈[0,1] をダイス結果にマッピングします:δ=0 または 6 → 6;δ=1→1;δ=2→2;δ=3→3;δ=4→4;δ=5→5。
この方法は両プレイヤーが無偏なランダム数を選択することに依存します。結果として得られる距離の分布は、0 と 6 がそれぞれ 1/12、距離 1–5 がそれぞれ 1/6 であり、多く回数振った場合に各面が 16.66 % の均等な確率になります。
Lua スクリプトでは

math.random()
とルックアップテーブルを用い、100 万回のシミュレーションで均一分布が確認されます。
このトリックは「言語的テニス」という速攻ゲーム向けに設計されています。このゲームではプレイヤーもスタミナ(3 ポイント、3 ターン後に再生、戻り閾値を調整するために使用可能)を管理します。著者は、物理的なサイコロが利用できない場合に最適であるとし、カジュアルな D&D やその他のテーブルトップセッションでの使用を推奨しています。ただし d6 のみ対応であり、正直なランダム選択に依存する点は認めています。
記事はユーザー 42yeah による copyleft 2023 ライセンスの下で公開されています。

本文

二人でサイコロを振る方法
2023‑08‑05 22:16:30 +0800


西安へ友人のZambon21と一緒に旅行しました。ツアーガイドを待っている間、携帯電話のバッテリーが切れたため、二人だけでランダムな数値を生成する簡単な方法を思いつきました。このアイデアは、単位円上の極座標を使って公平なサイコロ振りを行うものです。以下では、その手順、離散化(D6への変換)、Luaでの実験例、そして同じメカニズムで遊べる「ボキャブルテニス」というゲームについて整理しています。


方法論

  1. 二人の参加者

    • Aが角度 (\theta_1) を提案する。
    • Bが角度 (\theta_2) を提案する。
  2. 角度差を計算
    [ \delta = |\theta_1-\theta_2| ] 正規化: [ \delta = \frac{\delta}{\pi} ]

  3. もし (\delta > 1)(すなわち (\pi) を超える)なら
    [ \delta \leftarrow \delta - 1 ] これでランダム数は常に ([0,1)) に収まります。

  4. バイアスと公平性
    両者の利害が対立すると、(\delta) を最大化/最小化しようとして半ばランダムな結果になります。


離散化 – D6への変換

人間は連続値を正確に生成できないため、離散化します:

  • 単位円を90°回転させて「0」を上端に配置。
  • y 軸で反転して角度が時計回りに増加するように(時計の針と同じ)。
  • 円を12個の位置(時計の数字)にマッピング。

両プレイヤーは ([0,12)) の整数を同時に選びます。
(d) を時計上での角度差とすると:

角度距離サイコロ振り
0 または 66
11
22
33
44
55

確率表

距離着地点確率
00(1/12)
11, 11(1/6)
22, 10(1/6)
33, 9(1/6)
44, 8(1/6)
55, 7(1/6)
66(1/12)

回転対称性のおかげで、どちらのプレイヤーを基準にしても分布は変わりません。


Lua 実験

diecount = {}

function propose()
    return math.floor(math.random() * 12)
end

function wrap(x)
    if x < 0 then return x + 12 end
    if x >= 12 then return x - 12 end
    return x
end

local lut = {0,1,2,3,4,5,6,5,4,3,2,1}

function pdistance(a,b)
    return lut[wrap(b-a)+1]
end

function roll()
    local a, b = propose(), propose()
    local pt = pdistance(a,b)
    if pt == 0 then pt = 6 end
    diecount[pt] = (diecount[pt] or 0) + 1
end

for i=1,1000000 do roll() end

print("Roll | Count | %")
for r=1,6 do
    local cnt = diecount[r]
    print(string.format("%2d | %6d | %.3f%%", r, cnt, cnt/1000000*100))
end

サンプル出力

RollCount%
116639016.639%
216706816.707%
316669716.670%
416638516.639%
516662216.662%
616683816.684%

公平なサイコロならそれぞれの面が正確に (1/6 \approx 16.667%) を示します。実験結果はこれをよく近似しています。


ボキャブルテニス(任意ゲーム)

  • 各プレイヤーは 3 スタミナポイント でスタート。
  • プレイヤー1がサーブし、スタミナを使って必要な振り値を上げることができる。
  • 両者は同時にランダム数を名乗り、その結果がサイコロ値 (a) になる。
  • プレイヤー2はプレイヤー1が消費したスタミナ分を足して少なくとも (a +) スタミナを振る必要がある。
  • スタミナは3ターンごとに回復。
  • 必要に応じてペナルティや得点ルールなどを追加可能。

結論

この二人用のトリックで、サイコロも電子機器もなく公平な d6 を作ることができます。両者の目標が対立しているときに最も効果的です。バイアスになる可能性はあるものの、シンプルで携帯性が高く、次回の軽い D&D セッションや外出先でのランダム数生成にぜひご利用ください。


Copyleft 2023 42yeah.

同じ日のほかのニュース

一覧に戻る →

2025/12/08 2:18

I failed to recreate the 1996 Space Jam website with Claude

## Japanese Translation: ## 要約 著者は、Claude AI を使って 1996 年の Warner Bros の「Space Jam」ランディングページをスクリーンショットとアセットフォルダから再構築しようとしました。元のサイトは 200 KB 未満の単一 HTML ファイルで、絶対位置決め、テーブルレイアウト、およびタイル状の星空 GIF 背景に依存しています。 **プロセスと所見** 1. **初期試行:** Claude は概算レイアウトを生成しましたが、惑星軌道を誤った位置に配置しました。軌道パターンは認識できたものの、それを再現することには失敗しました。 2. **構造化プロンプト:** 著者は Claude に「知覚分析」「空間解釈」「再構築計画」の各セクションで理由を説明させ、正確なピクセル座標を要求しましたが、Claude はそれらを提供できませんでした。 3. **カスタムツール:** 精度向上のために 50 px → 5 px のグリッドオーバーレイ、ラベル付き座標参照点、色差比較、スクリーンショットサイドバイサイドビューア、およびスクリーンショットを 6 区域に分割するスクリプトを構築しました。 4. **結果:** Claude の調整は目標から 5–10 px 内に留まりましたが、正しい軌道半径(約 350–400 px)には決して収束しませんでした。内部レイアウトが生成されると、その後のフィードバックは元のスクリーンショットではなく、この誤ったモデルに基づいて行われました。 5. **トークナイズ仮説:** 著者は Claude が 16×16 パッチで画像をトークナイズしているため、細かい視覚的粒度が欠如し、セマンティック理解はあるもののピクセル精度が低いと考えました。 6. **ズームインテスト:** 200 % に拡大したスクリーンショットを提供して、大きなパッチで解像度が向上するか確認しましたが、Claude は依然として比例スケーリング指示に従いませんでした。 **結論** このタスクは未解決のままです。実験は Claude の空間推論限界をベンチマークとし、ピクセル単位で正確な画像再構築におけるモデルの現在の制約を示しています。

2025/12/08 7:18

How I block all online ads

## Japanese Translation: > **概要:** > 著者は、ウェブブラウザとモバイルアプリの両方で広告を排除するために長期的かつ多層的なアプローチを説明しています。彼は **Firefox + uBlock Origin** と最小限のフィルタリスト(組み込みのuBlockフィルタ、EasyList、AdGuard – Ads)と「広告でない不快要素」のためのカスタム非広告フィルタを使用します。 > DNS フィルタリングには **Pi‑hole(または AdGuard Home)** を Docker 上で $5 の DigitalOcean ドロップレットに稼働させ、WireGuard VPN の DNS サーバとして設定しています。トラフィックは **クラウドベースの VPN**(DigitalOcean、Hetzner、Azure、Google Cloud、または AWS)を経由し、プラットフォームが公的クラウド IP を検知して広告配信を減らします。 > この設定では **Cloudflare のキャプチャや HTTP エラー** が発生する場合があるため、著者は該当サイトで VPN を無効化しています。また、**Consent‑O‑Matic**(クッキーポップアップ)、**Buster**(キャプチャ)、**SponsorBlock**(動画広告)などのブラウザ拡張機能を推奨します。iOS では **Background App Refresh** をオフにするとデータ収集が減少し、Android では **ReVanced がアプリをパッチできますが、セキュリティリスクがあります** と指摘しています。 > 著者はこの統合戦略を 3 年以上使用しており、現在ほとんど広告を見ることはありません。プラットフォーム別の効果は異なります:YouTube は uBlock Origin + VPN(1週間〜1か月)が必要;Instagram は uBlock Origin のみで十分;Twitch は主に VPN に依存し、数日で効果が現れます;TikTok は両方のツールを使用しますが、数時間だけです。**AdMob** を利用するアプリも DNS ブロックの恩恵を受けます。 > 広告配信ネットワークは数日から数週間でパターンを観察し調整する可能性があるため、継続的な監視が必要です。著者は **Firebog** をブロックリストの良い情報源として引用し、正当なサイトを壊さないように許可リスト(allowlist)を維持する重要性を強調しています。

2025/12/07 23:37

Dollar-stores overcharge cash-strapped customers while promising low prices

## Japanese Translation: ドルジェネラルとファミリードラーは、棚に貼られたタグの価格よりも高い価格で顧客を頻繁に請求し、低所得層の買い物客に不釣り合いな過剰課金が広く発生しています。州検査と独立調査では、一部店舗でエラー率が88%に達するケースや、両チェーン全体で価格設定失敗が一貫して報告されています。 主な例としては、ノースカロライナ州ウィンザーのファミリードラーで23%のスキャンアイテムが過剰請求(同店の4回連続失敗)、オハイオ州ハミルトンのドルジェネラルで76%のエラー率(2022年10月)、ニュージャージー州バウンドブルックのファミリードラーで68%の不一致(2023年2月)があります。2022年1月以降、ドルジェネラルは4,300件以上、ファミリードラーは2,100件以上の価格失敗事例を記録しています。 アリゾナ州(60万ドル)、コロラド州(40万ドル)、ニュージャージー州・バーモント州・ウィスコンシン州・オハイオ州(最大100万ドル)など複数の州がチェーンと訴訟を和解し、連邦および州の司法長官は追加訴訟を提起しています。株主訴訟では、経営陣がシステム的問題を認識していたと主張されています。ニュージャージー州の連邦裁判所は、モバイルアプリ利用に関連する仲裁条項を理由にドルジェネラルに対する集団訴訟を停止し、消費者の救済手段を制限しました。 規制当局は現在の1検査あたり5,000ドル上限を超えるより厳格な執行や高い罰則を課すことができ、さらに州が調査を進めるにつれて追加の和解が生じる可能性があります。影響としては顧客信頼の低下、チェーンへの潜在的財務損失、評判へのダメージ、およびドルストア業界全体での価格設定と人員管理の強化への動きが挙げられます。