---
# System prepended metadata

title: '2024年度 情報とデータの基礎 第10回　<br>サイエンス・スキルI 計算機による問題解決の基礎(5): Python初級プログラミング(リストと乱数)'
tags: [' lecture', ICL_B_2024]

---

---
lang: ja
tags: ICL_B_2024, lecture
---

# 2024年度 情報とデータの基礎 第10回　<br>サイエンス・スキルI 計算機による問題解決の基礎(5): Python初級プログラミング(リストと乱数)
[ポータルへ戻る](https://hackmd.io/@nagae/ICL_B_2024)


# 今回のやることリスト
1. ノートブック「Colabプログラム入門(3)」を実行しながら閲覧する
2. 課題5 「ランダムに生成された整数列を素数と合成数とに分類する」


# 1. ノートブック「Colabプログラム入門(3)」を実行しながら閲覧する
1. Classroom＞授業＞参考資料＞Colabプログラム入門(3)にアクセス
2. Colaboratory で開いて順に実行してみる．

# 2. 課題5 「リストと乱数」
## 課題5-1 「ランダムに生成された整数列を素数と合成数とに分類する」
:::info
2つの整数`N`と`M`が与えられた時，以下の処理を行うプログラムをコード・セルに記述しなさい：
- `M`個の「2以上`N`未満のランダムな整数」からなるリスト`nums`を生成する
- `nums`を素数のリスト`prime_nums`と合成数のリスト`composite_nums`に分類する
- `primes_nums`と`composite_nums`のそれぞれについて，その**要素数**と**最初の20個までの要素**を表示させる．

その上で，以下の3つのケースについて実行時間を計測し，その結果(出力と実行時間)および考察をテキスト・セルに記載しなさい：
1. `N=10,000`, `M=50` (`N`が1万, `M`が50)
1. `N=10,000`, `M=5,000` (`N`が1万，`M`が5千)
2. `N=1,000,000`, `M=10,000`(`N`が百万，`M`が1万)

なお，プログラムを工夫すれば，`N, M`ともに1千万(`N=M=10,000,000`)の規模でも **15〜16秒程度**，`N,M`ともに1億(`N=M=100,000,000`)の規模でも **3分程度** で処理できる．挑戦してみよう．
:::

:::danger
ランダムに生成された`nums`の**順番を保持**したまま`prime_nums`と`composite_nums`に分類すること．たとえば，
```python
nums = [19, 4, 7, 9, 8, 13, 9, 5, 2, 9, 31]
```
が与えられたなら，以下の実行結果が得られるようにすること．
```python
prime_nums = [19, 7, 13, 5, 2, 31]
composite_nums = [4, 9, 8, 9, 9]
```
:::

## 課題5-2「凸凹の水槽に溜まる水」(チャレンジ課題)
**課題5-1**があっさり出来てしまってヒマだ，という人向け．
:::info
横幅 N [cm], 縦幅 1[cm] の凸凹した床を持つ容器を考える．容器の横幅は1 [cm]ごとに N 個の地点0, 1, ..., N-1に区分されており，各地点の床の高さh[0], h[1], ..., h[N-1] は 0 以上 M 未満のランダムな整数値で与えられるとする． 容器の床の高さが N 個の要素を持つリストhで与えられたとき，この容器を水に沈めてから持ち上げた時に溜められる水の量を求めるプログラムを作成せよ．
:::
:::danger
例えば，N=20, M=40で床の高さとして

h = [18, 4, 33, 18, 35, 20, 0, 39, 1, 18, 25, 20, 39, 27, 17, 18, 26, 12, 35, 6]
が与えられた場合，水は下図のように溜まり，その総量は 246 [cm^3] となる：
![image](https://hackmd.io/_uploads/HyCi7sM80.png)
:::

## 提出方法・提出期限
課題5に添付した Colab ノートブックをマイドライブにコピーし，ファイル名を
学籍番号_氏名-課題5.ipynb
とした上で，内容を編集・保存し，**「提出」ボタン**を押す．

<div style="font-weight:bold; color:red">締め切り：7月3日(水)23:59</div>

## 評価基準
### 必須項目(守られていない場合は減点)
- ファイル名，氏名，日付が適切に修正されているか．
- 適切に動作するプログラムができているか．
- **課題5-1**：提示された3つのケース(`(N,M)=(10000,50)`, `(N, M)=(10000,5000)`および`(N,M)=(1000000,10000)`)について，正しく動作するか．
- **課題5-2**：提示された床の高さ（`h = [18, 4, 33, 18, 35, 20, 0, 39, 1, 18, 25, 20, 39, 27, 17, 18, 26, 12, 35, 6]`）に対して，正しい水の量を求められるか．
- プログラムを記載したコード・セルがあるか．
- 実行結果や実行時間を整理し，考察を記述したテキスト・セルがあるか．
- 式や処理について十分なコメントが記載されているか．コメントは，プログラム・セル内にPythonのコメント(`#`以降に記載)として記述しても，テキストセルに記載してもよい．

下記の加点要素はいずれも**課題5-1**のもの．**課題5-2**については，適切に動作するプログラムを作り，その説明がなされていれば，「技術の習得」「創意工夫」を評価する．

### 加点要素(1): 技術の習得
- 素数判定などに関数を利用している
- 講義で使っていない機能(`numpy`モジュールなど)の利用
    - 十分なコメントが記載されている場合に限る
### 加点要素(2)： 創意工夫
- 指定されていない`(N, M)`についての実行結果を掲載している(ただし，多くても10個程度まで)．
- 効率化のための工夫をしている(講義中に紹介したものでも可)．
- `N`や`M`が大きい場合(例えば`N=M=10,000,000`や `N=M=100,000,000`)に対しても**高速**に計算するための工夫をしている．
- 自らの工夫によって実行時間がどれだけ減少したかを**定量的に評価**し，その根拠を考察している(考察はテキストセルに記述すること)．
- 特に，その考察について，不確実性を考慮した分析(例えば，複数回の実行時間の平均・分散を調べるなど)がある場合は，高く評価する．
