ヒルベルトのホテルのパラドックス
1号室から3号室に3人が泊まっていて2人が新しく来ると、全員が2部屋ずつ移り、1号室と2号室が空きます。名簿と到着人数を入れるだけで、各宿泊客の新しい部屋が分かります。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
処理はブラウザ内で完結します。ファイルは送信されません。無料でご利用いただけます。
ヒルベルトのホテルは、無限に関する古典的な思考実験です。無限の部屋を持つ満室のホテルでも、宿泊客全員に部屋を移ってもらうだけで、必ず新しい客を受け入れられます。現在の名簿(各宿泊客とその部屋番号)と新規到着数を送ると、全宿泊客の新しい部屋割りと、新たに空いた部屋の一覧が返されます。到着数が負の場合は拒否されます。客が「到着を取り消す」ことはできないからです。乱数も外部呼び出しもない完全な決定的処理のため、同じ入力からは常に同じ再割り当てが得られます。
パラドックスを具体的に
デイビッド・ヒルベルトの思考実験は、すべての部屋が埋まった無限の部屋数を持つホテルを想定します。新しい客が来たとき、普通の満室のホテルなら断るしかありませんが、ヒルベルトのホテルは違います。支配人は1号室の客を2号室へ、2号室の客を3号室へと移すだけで、全員が一部屋ずつ繰り上がり、1号室が空きます。
40人の観光客を乗せたバスが到着したら、全員が40部屋分繰り上がり、1号室から40号室までが空きます。ヒルベルトのホテル・パラドックス・シミュレーターは、与えられた名簿に対してまさにこの繰り上げを実行します。各宿泊客の部屋番号は到着数だけ増やされ、番号の下位で空いた部屋が明示的に返されるため、新参者がどの部屋に入るかを正確に確認できます。「
満室の無限ホテルにも必ず空きがある」という直観に反する教訓が、検証可能な部屋移動の一覧になります。
繰り上げの計算方法
アルゴリズムは意図的に単純で、完全に決定的です。名前と正の整数の部屋番号を持つ現在の宿泊客のリストと、新規到着数を指定します。シミュレーターは名簿を検証し(すべての部屋が正の整数、到着数が非負の整数であること)、すべての部屋番号に到着数を加算します。
7号室の客は、到着数が3なら10号室になります。出力には、各宿泊客の元の部屋と新しい部屋に加え、空いた部屋の完全な一覧(1から到着数までの整数)が含まれます。パラドックスは一方向にのみ成立するからです。
客はいくらでも詰め込めますが、「到着の取り消し」はできません。計算には乱数も時計もネットワークアクセスも一切含まれないため、同じ入力への繰り返しの呼び出しはバイト単位で同一の結果を返します。
活用シーン
この機能は、教育、デモンストレーション、手軽な動作確認のために作られました。教育者は、抽象的なパラドックスを学生が実際に触って確かめられるものに変えられます。到着数を変えて、すべての割り当てが更新される様子を見て、空いた部屋が常に新参者と一致することを確認できます。
また、「すべてのキーを定数だけずらす」という純粋な再割り当て関数の好例としても使えます。入力制限(1回の呼び出しにつき最大1万名の宿泊客と100万件の到着)は名簿を健全に保ち、教室やデモに必要な範囲をはるかに超えながら、応答を瞬時に保ちます。
活用例
パラドックスを対話的に教える
満室のホテルに1人、10人、1000人の新規到着者が来たとき、各宿泊客がどの部屋に移るかを学生に正確に示せます。
決定的なシフト関数のデモ
リハッシュや負荷分散で使われる「すべてのキーを定数だけ繰り上げる」パターンを、印象的な例で説明できます。
パズルやクイズのデータ生成
シフトを手計算せずに、数学パズル用の一貫した移動前後の部屋割り当てを生成できます。
よくある質問
なぜ負の到着数は拒否されるのですか?
パラドックスは一方向にのみ成立するためです。満室の無限ホテルはいくらでも客を吸収できますが、客は「到着を取り消せ」ません。
シミュレーションにランダムな要素はありますか?
いいえ。 完全に決定的で、乱数も時計もネットワークも使いません。同じ入力には常に同じ割り当てが返されます。
実際に無限のホテルをモデル化しているのですか?
パラドックスの有限のステップ、つまり与えられた名簿を与えられた到着数だけシフトする処理をシミュレートしています。無限であることは示唆にすぎず、ホテルがどれほど大きくてもシフトは成立します。
新しい客が来ると、どの部屋が空きますか?
1号室から、到着した人数と同じ番号の部屋までが空きます。たとえば2人来れば1号室と2号室が空き、元の客は全員、2つ上の番号の部屋へ移ります。
名簿の人数や到着数に上限はありますか?
はい、宿泊客は1万人まで、到着数は1回につき100万人までです。授業や説明に必要な規模をはるかに超えているうえ、結果もすぐに返ります。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/math/hilberts-hotel-paradox \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"guests":[{"guest":"Ada","room":1},{"guest":"Alan","room":2},{"guest":"Grace","room":3}],"new_arrivals":2}'const res = await fetch("https://api.kit.forhosting.com/math/hilberts-hotel-paradox", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"guests": [
{
"guest": "Ada",
"room": 1
},
{
"guest": "Alan",
"room": 2
},
{
"guest": "Grace",
"room": 3
}
],
"new_arrivals": 2
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/math/hilberts-hotel-paradox",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"guests": [
{
"guest": "Ada",
"room": 1
},
{
"guest": "Alan",
"room": 2
},
{
"guest": "Grace",
"room": 3
}
],
"new_arrivals": 2
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/math/hilberts-hotel-paradox", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"guests":[{"guest":"Ada","room":1},{"guest":"Alan","room":2},{"guest":"Grace","room":3}],"new_arrivals":2}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"guests":[{"guest":"Ada","room":1},{"guest":"Alan","room":2},{"guest":"Grace","room":3}],"new_arrivals":2}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/math/hilberts-hotel-paradox", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"guests": [
{
"guest": "Ada",
"room": 1
},
{
"guest": "Alan",
"room": 2
},
{
"guest": "Grace",
"room": 3
}
],
"new_arrivals": 2
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "math.hilberts_hotel_paradox",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_guests | 10000 |
max_arrivals | 1000000 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
このAPIはまさにその移動をシミュレートします。
繰り上げの計算方法
到着数が負の場合はinvalid_inputエラーで拒否され、課金もされません。
活用シーン
この操作は負荷分散、リングバッファ、リハッシュ方式にも現れ、このエンドポイントはセットアップ不要でそれを実演します。このページではAPIを提供するのと同じコードでブラウザ上で無料実行できるため、自動化する場合のみ1リクエスト$0.002をお支払いいただきます。
技術的な質問
料金はいくらですか?
API経由で1リクエスト$0.002です。このページでは同じコードでブラウザ上でも無料で実行できます。
freed_roomsフィールドには何が入りますか?
シフトによって空いた部屋番号、つまり1から到着数までの整数です。これらは新しい客が入る部屋です。
入力制限はどのくらいですか?
1リクエストにつき現在の宿泊客は最大10,000名、新規到着は最大1,000,000件です。すべての部屋番号は正の整数である必要があります。