Pythonで解く飛行機の座席シャッフル問題:最後の乗客が指定席に着席できる確率を求める
問題の概要
整数 n が飛行機の座席数を表しているとします。ここで、最初の乗客がチケットを紛失してしまったため、ランダムに座席を選んで着席することになりました。それ以外の乗客は各自の指定席を持っていますが、もし自分の席がすでに埋まっていた場合は、空いている座席の中からランダムに選んで着席します。このとき、最後の乗客が自分の指定席に着席できる確率を求めるのがこの問題です。
例えば、n = 5 の場合、出力は 0.5(50%)になります。実は、乗客が2人以上いる場合、答えは常に一定で 50% です。最終的には「正しい席に着席できるか、できないか」の2つの結果しか存在せず、両者が対称なため確率は常に半々になります。一方、n = 1 の場合は乗客が一人だけなので、確率は 100% となります。
解法のアプローチ
この問題は一見複雑なシミュレーションが必要に思えますが、実は非常にシンプルな条件分岐だけで解くことができます。
- n > 1 の場合は "50%" を返す
- n = 1 の場合は "100%" を返す
なぜ50%になるのか?
直感的に理解するには、次のように考えます。着席プロセスにおいて、誰かが「1番の座席(最初の乗客の本来の指定席)」か「n番の座席(最後の乗客の指定席)」のどちらかに着席した時点で、以降の展開は確定します。全ての乗客が自分の席に座れる限り混乱は起きず、混乱の原因となるのは必ずこの2つの席のどちらかが先に埋まる瞬間だからです。そして、どちらの席が先に埋まるかは対称的な確率事象であり、それぞれ等しい確率で発生します。そのため、最後の乗客が自分の席に座れる確率はちょうど 1/2(50%)になるのです。
Pythonコード例
以下の実装を見ると、理解が深まります。
def solve(n):
return "50%" if n > 1 else "100%"
n = 5
print(solve(n))
入力
5
出力
50%
-
Pythonで配列(リスト)の合計を求める方法をわかりやすく解説
この記事では、配列(リスト)の合計値を求めるという問題に対して、Pythonでの解決策とアプローチをわかりやすく解説します。 問題の定義 配列が入力として与えられたとき、その配列に含まれるすべての要素の合計を計算することを目標とします。 例えば、[1, 2, 3, 4, 5] という配列が与えられた場合、出力は 15 になります。 アプローチ1:ループを使った素朴な方法(総当たり法) 最も基本的な方法は、リストを先頭から順に走査し、各要素を合計用の変数に加算していくやり方です。手順は以下の通りです。 合計を格納する変数を 0 で初期化します。 for ループでリストの各要素を取り出し、順番に
-
Pythonで円柱の周囲長を求めるプログラムの書き方
この記事では、以下の問題をPythonを使って解く方法を解説します。 問題の定義 問題: 直径と高さを入力として受け取り、円柱の周囲長を求める。 ここでいう「周囲長」とは、円柱を横から見たときに現れる長方形の外周のことです。つまり、円柱の側面を展開すると長方形になり、その縦が円柱の高さ、横が円の直径(円周ではありません)に相当します。 したがって、周囲長は次の式で表せます。 周囲長 = 2 × ( 高さ h + 直径 d ) d:円柱の直径 h:円柱の高さ 実装例 それでは、実際のコードを見てみましょう。 # 円柱の周囲長を計算する関数 def perimeter(diameter, he