93 lines
6.5 KiB
Markdown
93 lines
6.5 KiB
Markdown
![]() |
---
|
||
|
id: 5e44414f903586ffb414c950
|
||
|
title: 確率計算プログラム
|
||
|
challengeType: 10
|
||
|
forumTopicId: 462364
|
||
|
dashedName: probability-calculator
|
||
|
---
|
||
|
|
||
|
# --description--
|
||
|
|
||
|
このプロジェクトは [Replit スターターコード](https://replit.com/github/freeCodeCamp/boilerplate-probability-calculator)を使用して作業を行います。
|
||
|
|
||
|
Python カリキュラムの対話式教育コンテンツを引き続き開発中です。 現在、下記の freeCodeCamp.org YouTube チャンネルで、このプロジェクトの完了に必要なすべての知識について説明する動画をいくつか公開しています。
|
||
|
|
||
|
- [「みんなで Python」ビデオコース](https://www.freecodecamp.org/news/python-for-everybody/) (14 時間)
|
||
|
|
||
|
- [「Python を学ぶ」ビデオコース](https://www.freecodecamp.org/news/learn-python-video-course/) (10 時間)
|
||
|
|
||
|
# --instructions--
|
||
|
|
||
|
帽子があり、その中に青いボールが 5 個、赤いボールが 4 個、緑のボールが 2 個入っているとします。 4 個のボールを無作為に取り出す場合、赤のボールが 1 個以上、緑のボールが 2 個含まれる確率は、いくらになりますか? 高度な数学を駆使して確率を計算することも可能ですが、多数の実験を実行しておおよその確率を推定するプログラムを記述する方が簡単です。
|
||
|
|
||
|
このプロジェクトでは、特定のボールを帽子から無作為に取り出す場合のおおよその確率を調べるプログラムを作成します。
|
||
|
|
||
|
まず、`prob_calculator.py` で `Hat` クラスを作成してください。 このクラスは、帽子に入っている各色のボールの数を指定する可変個の引数を受け取る必要があります。 たとえば、次のどの方法でもクラスオブジェクトを作成することができます。
|
||
|
|
||
|
```py
|
||
|
hat1 = Hat(yellow=3, blue=2, green=6)
|
||
|
hat2 = Hat(red=5, orange=4)
|
||
|
hat3 = Hat(red=5, orange=4, black=1, blue=0, pink=2, striped=9)
|
||
|
```
|
||
|
|
||
|
帽子は常に、少なくとも 1 個のボールが入った状態で作成されます。 作成時に帽子オブジェクトに渡された引数を、`contents` インスタンス変数に変換する必要があります。 `contents` は、帽子に入っているボールごとにアイテムを 1 つずつ含む文字列のリストである必要があります。 リスト内の各アイテムは、その色のボール 1 個分を表す色の名前である必要があります。 たとえば、帽子が `{"red": 2, "blue": 1}` の場合、`contents` は `["red", "red", "blue"]` になる必要があります。
|
||
|
|
||
|
`Hat` クラスには `draw` メソッドが必要です。このメソッドは、帽子から取り出すボールの個数を示す引数を受け取ります。 draw メソッドは、`contents` からボールを無作為に取り除き、それらのボールを文字列のリストとして返す必要があります。 交換のできない壺の実験と同様に、取り出したボールは帽子に戻さないものとします。 取り出すボールの数が利用可能な数を超える場合は、すべてのボールを返してください。
|
||
|
|
||
|
次に、(`Hat` クラスの中ではなく) `prob_calculator.py` で `experiment` 関数を作成してください。 この関数は次の引数を受け取る必要があります。
|
||
|
|
||
|
- `hat`: 関数内でコピーする必要のあるボールを含む帽子オブジェクト。
|
||
|
- `expected_balls`: 実験で帽子から取り出そうとするボールの正確なグループを示すオブジェクト。 たとえば、青のボール 2 個と赤のボール 1 個を帽子から取り出す確率を調べるには、`expected_balls` を `{"blue":2, "red":1}` に設定します。
|
||
|
- `num_balls_drawn`: 各実験で帽子から取り出すボールの数。
|
||
|
- `num_experiments`: 実行する実験の回数 (実験の回数が多いほど、おおよその確率の正確性が高まります)。
|
||
|
|
||
|
`experiment` 関数は、確率を返す必要があります。
|
||
|
|
||
|
たとえば、黒を 6 個、赤を 4 個、緑を 3 個含む帽子から 5 個のボールを取り出す場合に、赤のボールが少なくとも 2 個、緑のボールが少なくとも 1 個含まれる確率を求めたいとしましょう。 それには、`N` 回の実験を行い、赤のボールが少なくとも 2 個、緑のボールが少なくとも 1 個になった回数 `M` を数え、確率を `M/N` として推定します。 実験ではそれぞれ、指定されたボールの入った帽子の状態から始め、いくつかのボールを取り出し、期待されるボールを取り出したかどうかを確認します。
|
||
|
|
||
|
上記の例で 2000 回の実験を行う場合は、`experiment` 関数を次のように呼び出します。
|
||
|
|
||
|
```py
|
||
|
hat = Hat(black=6, red=4, green=3)
|
||
|
probability = experiment(hat=hat,
|
||
|
expected_balls={"red":2,"green":1},
|
||
|
num_balls_drawn=5,
|
||
|
num_experiments=2000)
|
||
|
```
|
||
|
|
||
|
この方法は無作為抽出に基づいているため、コードが実行されるたびに確率が多少変わります。
|
||
|
|
||
|
*ヒント: `prob_calculator.py` の先頭ですでにインポートされているモジュールを使用することを検討してください。 `prob_calculator.py` の中で乱数シードを初期化しないでください。*
|
||
|
|
||
|
## 開発
|
||
|
|
||
|
`prob_calculator.py` でコードを記述してください。 開発には `main.py` を使用してコードをテストすることができます。 「実行」ボタンをクリックすると `main.py` が実行されます。
|
||
|
|
||
|
ボイラープレートには `copy` モジュールと `random` モジュール用の `import` ステートメントが含まれています。 これらをプロジェクトで使用することを検討してください。
|
||
|
|
||
|
## テスト
|
||
|
|
||
|
このプロジェクトの単体テストは `test_module.py` にあります。 すでに `test_module.py` から `main.py` にテストをインポートしてあります。 「実行」ボタンを押すと自動的にテストが実行されます。
|
||
|
|
||
|
## 提出
|
||
|
|
||
|
プロジェクトの URL をコピーし、freeCodeCamp に提出してください。
|
||
|
|
||
|
# --hints--
|
||
|
|
||
|
確率を正しく計算し、すべてのテストに合格する必要があります。
|
||
|
|
||
|
```js
|
||
|
|
||
|
```
|
||
|
|
||
|
# --solutions--
|
||
|
|
||
|
```js
|
||
|
/**
|
||
|
Backend challenges don't need solutions,
|
||
|
because they would need to be tested against a full working project.
|
||
|
Please check our contributing guidelines to learn more.
|
||
|
*/
|
||
|
```
|