2024-2I プログラミング1 第08回 講義資料

2024年06月14日(金)1・2時限

1 準備

1.1 補足

他高専の「情報系学科」のプログラミング教育の動向も把握しておきましょう。特に「2年生」で、どのようなプログラミング学習をしているのか確認してみてください。

皆さんは、3年次の前期に学修単位の「プログラミング2」で C言語 を学習します。また、3年次の後期に学修単位の「プログラミング3」で ウェブ系言語 (フロントエンドはJS (React) とバックエンドはPython (Django) の両方)を学習します。また、3年の「データ構造とアルゴリズム1」と、4年の「データ構造とアルゴリズム2」でも C言語 を扱います。

2 課題03

この「課題03」は、今回の講義内容を把握したうえで 最後に取り組んでもらう演習 です。以下、この演習に取り組むために必要な要素 (リスト関連の処理) を扱っていきます。それらを効果的に学ぶためにも、はじめに「課題03」の内容を把握しておいてください。


FC版DQ3 (ファミコン版のドラゴンクエスト3) の武器を扱った「100連ガチャ」のシミュレータを作成してください。ガチャにより排出される武器は item_names_str で「カンマ , 区切り」で与えられる全33種の武器となっています。また、その排出比は item_p_str でカンマ区切りで与えた数値となっています。

ここでの排出比とは・・・例えば「ひのきのぼう」「こんぼう」「どうのつるぎ」の全3種を仮定し、その排出比が「\(10\)」「\(5\)」「\(2\)」であれば、「ひのきのぼう」が排出される確率は \(10/(10+5+2)\)、「こんぼう」が排出される確率は \(5/(10+5+2)\)、「どうのつるぎ」が排出される確率は \(2/(10+5+2)\) のように考えてください。

%reset -f
# カンマ区切りの文字列で情報が与えられているものとします。
# ここから・・・
item_names_str = 'ひのきのぼう,こんぼう,どうのつるぎ,せいなるナイフ,くさりがま,とげのむち,まどうしのつえ,てつのやり,どくばり,てつのつめ,はがねのつるぎ,てつのオノ,あまぐものつえ,いかづちのつえ,さざなみのつえ,さばきのつえ,おおばさみ,ゆうわくのけん,りりょくのつえ,おおかなづち,はやぶさのけん,ゾンビキラー,ドラゴンキラー,くさなぎのけん,ガイアのつるぎ,ふぶきのつるぎ,いなづまのけん,まじんのオノ,らいじんのけん,もろはのつるぎ,はかいのつるぎ,おうごんのつめ,おうじゃのけん'
item_p_str = '50,50,50,40,40,35,30,30,25,20,20,20,10,10,10,10,10,10,10,10,5,5,5,4,3,3,2,2,2,2,2,2,1'
# ・・・ここまでは変更不可です。

上記の設定に基づき100連ガチャの「シミュレーション」を実行し、次のような出力を得たいとします。

100連ガチャの結果、以下のアイテムを獲得しました。
ひのきのぼう ... 8個
こんぼう ... 8個
どうのつるぎ ... 9個
せいなるナイフ ... 8個
くさりがま ... 11個
とげのむち ... 7個
まどうしのつえ ... 5個
てつのやり ... 7個
どくばり ... 6個
てつのつめ ... 5個
はがねのつるぎ ... 4個
てつのオノ ... 3個
あまぐものつえ ... 2個
いかづちのつえ ... 1個
さざなみのつえ ... 6個
さばきのつえ ... 2個
ゆうわくのけん ... 3個
りりょくのつえ ... 2個
おおかなづち ... 1個
ゾンビキラー ... 1個
まじんのオノ ... 1個

この要求を満たすことができるPythonプログラムを設計、実装してください。上記に準ずる結果が得られれば「各種演出・装飾を追加したもの」や「Colab機能などを利用したもの」などでもよいです。

3 確認:print関数の引数

以前に紹介済みですが、今回の演習で利用する可能性があるため、print 関数に 複数の引数 を与えた場合の動作と、sep 引数を与えた場合の動作について改めて確認しておきます。いまさらですが「引数」の読み方は 「ひきすう」 です (「いんすう」ではないので注意してください ) 。

print 関数には、カンマ区切りで 2個以上の引数 を与えることが可能で、その場合、次のように半角スペース1文字で区切られた文字列出力を得ることができます。

%reset -f
a='AAA'
b='BBB'
c='CCC'
print(a,b,c,'DDD') # カンマ区切りで引数を4個を与えている

上記プログラムの実行結果は次のようになります。

AAA BBB CCC DDD

半角スペース1文字で区切られた出力となっていることを確認してください。

また、最後の引数に sep= を与えると( 半角スペースではなく) 任意の区切り文字を使用することができました。sep は「Separator (セパレータ)」の略になります。

次のプログラムを実行して結果を確認してください。

%reset -f
a='AAA'
b='BBB'
c='CCC'
print(a,b,c,'DDD',sep=':') # sep=を追加

なお、print(a, b, c, sep='-', end='' ) における sep=end= のような引数を キーワード引数名前付き引数 といいます。これらの引数は、通常の引数 (これらを 位置引数 といいます) のあとに与える必要があります。

キーワード引数位置引数 よりも前に記述するとどうなるか実際に確認してください。

%reset -f
a='AAA'
b='BBB'
c='CCC'
print(a,sep='---',b c) # キーワード引数が途中に存在

4 Pythonにおける「リスト」とは

C言語における配列 (Array: アレイ) に相当する機能を、Python では リスト (List: リスト)と言います。

例えば、次の array.c のようなC言語プログラムと、同じ出力を得る Pythonプログラムは list.py のように書くことができます。2つの言語における 記号の違いなど に注意して比較してください。

#include <stdio.h>
#define N 4
#define M 20 // 1アイテム(英数字であれば)最大20文字まで
int main(void){
  char items[N][M]={"どうのつるぎ","やくそう","どくけしそう","ぬののふく"};
  for(int i=0;i<N;i++){
    printf("%s\n",items[i]);
  }
}
%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
for i in range(len(items)):
  print(items[i])

いずれのプログラムも実行結果は次のようになります。

どうのつるぎ
やくそう
どくけしそう
ぬののふく

「Pythonのリスト」は「C言語の配列」よりも非常に柔軟で強力な機能を提供してくれます(C++言語におけるVectorに近い機能を提供してくれます)。その結果、C言語の配列では「できないこと」「極めて面倒なこと」を、Pythonのリストでは比較的簡単に行なうこと (短いコードで記述すること) ができます

ここからリストの使い方や、リストが持つ機能について詳しく学んでいきます。

4.1 演習1 ( 目標時間: 3分)

上記の list.py第03行目 以降を変更して次のような結果が得られるようにしてください。なお、「f文字列」を利用するようにしてください。

もちもの「どうのつるぎ」
もちもの「やくそう」
もちもの「どくけしそう」
もちもの「ぬののふく」

5 リスト初期化と要素の参照

リストでは、list.py の例のように文字列のほか、数値各種オブジェクト を格納することができます (「オブジェクト」については、この先で学んでいくので現時点では気にしないでください)。

リストの初期化 (リテラルを使った初期値の設定) は次のように記述します。リストを構成する「要素」の参照 (=読み取り) は C言語と同じように []角括弧 / 大括弧 を使用します。

%reset -f
a = [10,20,30,40] # 初期化(数値)
b = a[0] * a[1]   # a[0]で0番目の要素(=10)、a[1]で1番目の要素(=20)を参照
print(f'b = {b}') # b = 200
%reset -f
item_names = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく'] # 初期化(文字列)
item_prices = [100,8,10,10] # 初期化(数値)
i=1
print(f'{item_names[i]}{item_prices[i]}Gで売られている。')

角括弧のなかに与える数値を インデックス添え字 と言います。インデックス (添え字)ゼロオリジン になります( リストの先頭は 0 となる点に注意してください )。

注意: 変数に「list」という名前を付けないこと

Pythonにおいて list は、iffor と同様に 変数名などに使用してはいけない予約語 になっています。list という変数を作成しても、即座にエラーになるわけではありませんが、以降のプログラムのどこかで問題を引き起こす可能性があります。

5.1 演習2 ( 目標時間: 4分)

上記の dq3-items.py プログラムの 第04行目以降 を修正して、実行結果として次のような文字列が得られるように変更してください。なお、売価は価格の3/4で設定されているものとします。小数以下は「切り捨て」とします。

「どうのつるぎ」は、100G で購入し、75G で売却できる。
「やくそう」は、8G で購入し、6G で売却できる。
「どくけしそう」は、10G で購入し、7G で売却できる。
「ぬののふく」は、10G で購入し、7G で売却できる。

ヒント

5.2 文字列を使ったリストの初期化

実用的なプログラムでは、リストを構成する要素が 1つの文字列として与えられること (あるいはテキストファイルから入力されること) があります。

例えば、次のように「カンマ区切りの文字列」でリストとして扱いたい情報が与えられることがあります。

%reset -f
item_names_str='どうのつるぎ,やくそう,どくけしそう,ぬののふく' # カンマ区切り文字列
print(item_names_str)

このようなとき、手作業で ['どうのつるぎ','やくそう','どくけしそう','ぬののふく'] のように書き換えるべきではありません。

次のように、文字列の split メソッドを利用して 任意文字で文字列を分解してリスト化 することができます。

%reset -f
item_names_str='どうのつるぎ,やくそう,どくけしそう,ぬののふく' # 文字列

# item_names_str -> item_names
item_names = item_names_str.split(',') # ★文字列をカンマで分解してリスト化
for i in range(len(item_names)):
  print(item_names[i])

また、分解した文字列をさらに 数値に変換したい という場合もあります。

このような場合は、次のように組み込み関数の mapfloat を利用します。float については 第05回講義で学習済みです。

%reset -f
item_p_str='0.65 0.30 0.05' # スペース(SP)区切りの文字列
item_p1 = item_p_str.split(' ') # 文字列をSPで分解してリスト化

# 現状で item_p1 の要素は【文字列】 ※計算処理に利用できない
for i in range(len(item_p1)):
  print(item_p1[i]*100)

print('---')

# item_p1 の要素を【数値】に変換
item_p2 = list(map(float,item_p1)) # ★ここがポイント!
for i in range(len(item_p2)):
  print(item_p2[i]*100)

このプログラムで使われている map については、以降の授業で 詳しく解説します。現状では 第12行目 のように処理を書くことで「リストの要素を文字列から数値 (実数値 float) に変換できる」と知っておいてください。

なお、要素を文字列から整数値 (int) に変換したい場合は、map の第1引数に int を与えてください。

5.3 演習3 ( 目標時間: 3分)

次のようにカンマ区切りで「アイテム名称」と、そのアイテムに関する「数値 (パラメータ)」が与えられているものとします。item_names_str から item_names というリスト (要素は文字列) を作成してください。また、item_p_str から item_p というリスト (要素は数値) を作成してください。

%reset -f
item_names_str = 'ひのきのぼう,こんぼう,どうのつるぎ,せいなるナイフ,くさりがま,とげのむち,まどうしのつえ,てつのやり,どくばり,てつのつめ,はがねのつるぎ,てつのオノ,あまぐものつえ,いかづちのつえ,さざなみのつえ,さばきのつえ,おおばさみ,ゆうわくのけん,りりょくのつえ,おおかなづち,はやぶさのけん,ゾンビキラー,ドラゴンキラー,くさなぎのけん,ガイアのつるぎ,ふぶきのつるぎ,いなづまのけん,まじんのオノ,らいじんのけん,もろはのつるぎ,はかいのつるぎ,おうごんのつめ,おうじゃのけん'
item_p_str = '50,50,50,40,40,35,30,30,25,20,20,20,10,10,10,10,10,10,10,10,5,5,5,4,3,3,2,2,2,2,2,1,1'

item_names = 0 # 書き換える
item_p     = 0 # 書き換える(複数行でも可)

print(item_names)
print(item_p)

正しく処理ができれば、実行結果として次のような値を得るはずです。

['ひのきのぼう', 'こんぼう', 'どうのつるぎ', …略…, 'おうじゃのけん']
[50, 50, 50, …略…, 1]

なお、item_p の出力が…

['50', '50', '50', …略…, '1'] # リストの要素が【文字列】
[50., 50.0, 50.0, …略…, 1.0]  # リストの要素が【実数値】

…のようにシングルクォーテーション付きになっている場合、要素を正しく「整数値」に変換できていません(リストの要素が 実数値や文字列 になっています)

6 リストのインデックス範囲

リストは ゼロオリジン であり、角括弧内には 整数値でインデックスを与える必要 があります。

%reset -f
item_names = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
print(item_names[0])

上記のプログラムの 第03行目 を書き換えて、

7 リストの要素数

リストが内部に「いくつの要素を持っているか」は、次のように 組み込み関数len を使って取得することができます。lenLength (長さ・レングス) の意味を意味します。

次のプログラムを実行して結果を確認してください。

%reset -f
item_names = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
print(f'現在、{len(item_names)}個のアイテムを所持しています。')

これを利用すれば、for は次のようにスマートに記述することができます。

%reset -f
item_names = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
for i in range(len(item_names)): # ★rangeの引数に注目
  print(item_names[i])

len(item_names) は整数値を返すので、range 以外にも、次のように計算式などに利用することができます。実際に実行して結果を確認してみてください。

%reset -f
max_item_num = 99
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
x = max_item_num - len(items) # ★lenを計算式に組み込む
print(f'あと {x}個 のアイテムを持つことができます。')

7.1 リストの初期化2

[0,0,0,0,0]['乙','乙','乙'] のように全て同じ値を持ったリストは、次のように初期化できます。

%reset -f
a1 = [0] * 5
a2 = ['乙'] * 3

print(a1) # -> [0, 0, 0, 0, 0]
print(a2) # -> ['乙', '乙', '乙']

7.2 演習4 ( 目標時間: 3分)

item_names と同じ長さ (=同じ要素数) で、その要素がすべて 0(整数値) となるリスト item_counts を作成してください。

%reset -f
item_names_str = 'ひのきのぼう,こんぼう,どうのつるぎ,せいなるナイフ,くさりがま,とげのむち,まどうしのつえ,てつのやり,どくばり,てつのつめ,はがねのつるぎ,てつのオノ,あまぐものつえ,いかづちのつえ,さざなみのつえ,さばきのつえ,おおばさみ,ゆうわくのけん,りりょくのつえ,おおかなづち,はやぶさのけん,ゾンビキラー,ドラゴンキラー,くさなぎのけん,ガイアのつるぎ,ふぶきのつるぎ,いなづまのけん,まじんのオノ,らいじんのけん,もろはのつるぎ,はかいのつるぎ,おうごんのつめ,おうじゃのけん'
item_names = item_names_str.split(',')
item_counts = 0 # ここを書き換える。33という数値の直接記述は禁止。lenを利用すること。

print(f'item_namesの長さ = {len(item_names)}')
print(f'item_countsの長さ= {len(item_counts)}')
print(item_counts)

8 リストと組み合わせ可能な組み込み関数

len のほかにも、様々な 組み込み関数 とリストを組み合わせることができます。maxmin第07回講義で既に学習済みです。

%reset -f
a = [60,20,40,-30,90]
print(f'sum(a)= {sum(a)}')
print(f'max(a)= {max(a)}')
print(f'min(a)= {min(a)}')

上記のプログラムについて、リストの要素が文字列であった場合にどのようになるか確認してください。例えば a=['どうのつるぎ','やくそう','どくけしそう','ぬののふく'] である場合にどのようになるか確認してください。

summaxmin 以外の 組み込み関数 もリストを引数にとることができます。

9 リストとprint関数

print関数の引数に、直接、リストを与えることができます。次のプログラムを実行して、どのような結果が得られるかを確認してください。

%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
print(items) # リストをそのまま引数にする。

中級者向け: リストのアンパック

リストを関数の引数として与える場合、先頭にアスタリスクをつけて アンパック (展開) という処理を施すことができます。これにより、次のようなことができます。

%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
print(*items, sep='\n') # itemsの頭に「*」を付けた。また sep 引数を設定

このとき、第03行目 は次のような文と同じ意味を持ちます。

print('どうのつるぎ','やくそう','どくけしそう','ぬののふく', sep='\n')

つまり、リストをアンパックすると「リスト内の要素を個別の引数として関数に与えること」が可能になります。

10 リストにおける要素の書き換えと追加

リストに含まれる要素は、次のようにインデックスで指定して書き換えることができます。実際に実行して確認してみてください。

%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
items[0] = 'はがねのつるぎ' 
items[2] = 'まんげつそう' # マヒの回復
for i in range(len(items)):
  print(items[i])

また、(要素の変更だけではなく) 要素の追加も可能で、それにはリストの append メソッドを使用します。

%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
items.append('かわのたて') # 末尾に追加
for i in range(len(items)):
  print(items[i])
print(f'※ 現在、所持しているアイテムは以上の {len(items)}個 です。')

このように リストの要素数が変化する状況では len(items) は非常に便利です。リストの要素数は、変数を使って保持するのではなく、常に len を使って参照するようにしてください。

また、リストの末尾以外に要素を追加したい場合は、リストの intsert メソッドを使用します。

%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
items.insert(0,'かわのたて') # items[0]に「かわのたて」を挿入
for i in range(len(items)):
  print(items[i])

無論、要素を削除するメソッドも存在します (検索すればすぐに見つけることができます)。

メソッドとは何か

オブジェクトが所有する関数を メソッド といいます。「オブジェクトとはなにか」は、まだ扱っていませんが、リストはオブジェクトです。そして、メソッドとは オブジェクトが持っている関数 を指します。オブジェクトが持っているメソッドは .(ドット) を使ってアクセスすることができます。

GoogleColabでは、プログラムを記述する際、メソッドの 入力補完 が受けられます。例えば、Google Colab.に次のプログラムを貼り付け、それに続けて03行目に items. まで入力してみてください。2秒ほどするとメソッドの一覧が表示されると思います。

%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']

表示された候補は、上下キーで選択して、Tabキーで決定します。

10.1 要素を持たない空のリスト

プログラムの実行中に appendinsert を使って、逐次、要素を追加していく場合、最初は要素を持たないリストで初期化したい場合 があります。これは、次のように記述できます。

%reset -f
items = [] # 要素を持たない空のリスト
items.append('どうのつるぎ')
items.append('たびびとのふく')
for i in range(len(items)):
  print(items[i])

また、第02行目items = list() のように記述することもできます。

10.2 演習5 ( 目標時間: 5分)

次のプログラムの 第04行目以降 を書き換えて、期待する出力が得られるようにしてください。

%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
# ここから下を書き換える (リストに要素を追加する処理を追加する)

for i in range(len(items)):
  print(items[i])

期待する出力 (アイテムの並び順も同じにすること)

ひかりのたて
おうじゃのつるぎ
どうのつるぎ
やくそう
てっかめん
どくけしそう
ぬののふく

なお、ここでは、第04行目items=['ひかりのたて','おうじゃのつるぎ','どうのつるぎ','やくそう','てっかめん','どくけしそう','ぬののふく'] のような記述をすることは意図していません。appendinsert を利用して演習に取り組んでください。

11 要素の検索

リストのなかに 指定の要素が存在するか を調べたい場合には in を使った if文を構成します。

%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
target = 'やくそう'
if target in items : # in を使った条件分岐
  print(f'勇者ヨシヒコは {target} を使用した')
else :
  print(f'勇者ヨシヒコは {target} を持っていない')

上記の 第03行目target = 'キメラのつばさ' に変更して動作を確認してください。

11.1 要素が含まれないことを判定するには

items というリストのなかに target という要素が存在するとき target in items は「真」となります。では、存在しないとき に「真」となる条件式はどのように書けるのか、自分自身で調べてみてください (ChatGPTなどを利用する方法もあります)。

11.2 当該要素のインデックスの検索

指定の要素が「リストの何番目に存在するか」を調べたい場合は、リストの index メソッドを使用します。なお、変数名の idx は、indexの略表記です。

次のプログラムを実行して、その結果を確認してください (単に実行するだけではなく target を書き換えて、それに応じて動作がどのように変化するか、予測して、確認してください。) 。

%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
target = 'やくそう'
if target in items :
  idx = items.index(target) # ★ 要素を検索して、発見したインデックスを返す
  print(f'勇者ヨシヒコの {idx}番目 のポケットに {target} が入っている')
else :
  print(f'勇者ヨシヒコは {target} を持っていない')

以下のプログラムを利用し、次のパターンにおいて変数 idx にどのような値が格納されるか (あるいは実行時エラーが生じるのか) を確認してください。

%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
target = 'やくそう'
idx = items.index(target)
print(f'idx={idx}')

11.3 演習6 ( 目標時間: 10分)

いま、所持しているアイテムの名前を item_names というリストで管理し、また、その所持数を item_counts というリストで管理しているものとします。

つまり、下記プログラムの第02行目第03行目によって「やくそう」を4個、「どくけしそう」を2個、「まんげつそう」を0個、「せかいじゅのは」を1個所持している状態を管理・表現しているものとします。

宝箱を開けたときの入手アイテム target により、それらが適切に更新されるようにプログラムを書き換えてください。

%reset -f
item_names  = ['やくそう','どくけしそう','まんげつそう','せかいじゅのは']
item_counts = [4,2,0,1] # アイテムの所持数

target = 'やくそう'
print('勇者ヨシヒコは宝箱を開けた、',end='')
print(f'なんと「{target}」を手に入れた。')

# ここに target に応じて item_counts などを更新する処理を記載

print('\n---所持品の確認---')
for i in range(len(item_names)):
  print(f'{item_names[i]}...{item_counts[i]}個')

12 Pythonicなリストとfor文の組み合わせ

ここまでは、C言語のスタイルに寄せてリストとfor文を組み合わせる方法を紹介してきました。一方で、Pythonicに (Pythonらしいスタイルで) リストの要素を列挙する場合、次のようにコードを記述します。

%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
for t in items: # ★この行に注目
  print(t)
%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
for i in range(len(items)): # ★この行に注目
  print(items[i])

いずれも実行結果は次のようになります。py-style1.py では、itemsの要素数だけループが繰り返され (つまり、このケースでは要素数が4個なので、4回のループとなり)、変数 には1回目のループでは 'どうのつるぎ' が格納され、2回目のループでは 'やくそう' が格納され・・・という動作になります。

どうのつるぎ
やくそう
どくけしそう
ぬののふく

また、forブロックのなかで インデックス番号を参照したい場合 は、次のように enumerate を使って記述します。

%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
for i,t in enumerate(items): # ★この行に注目
  print(f'{i+1}. {t}')
%reset -f
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
for i in range(len(items)):
  print(f'{i+1}. {items[i]}')

いずれも実行結果は次のようになります。

1. どうのつるぎ
2. やくそう
3. どくけしそう
4. ぬののふく

py-style2.py では、変数 i にはゼロオリジンのインデックス番号、変数 c には要素が格納されます。

13 ランダム処理とリストの組み合わせ

第02回講義 で既に登場していますが、randomモジュールの choice 関数とリストを組み合わせることで「リストのなかからランダムに要素を取得する処理」を簡単に書くことができます。

%reset -f
import random as r
items = ['どうのつるぎ','やくそう','どくけしそう','ぬののふく']
c = r.choice(items)
print(f'勇者ヨシヒコはパルプンテを唱えた。なんと「{c}」が粉々に砕け散った。')

また choice 関数ではなく、choices 関数 (末尾の s がポイント) を使用すると「均等確率」ではなく「重み付きの確率」による要素のランダム取得ができます。次のプログラムを実行して確認してみてください。

%reset -f
import random as r
rank = ['LR','UR','SSR','SR','R']
p = [1,3,10,20,50]
c = r.choices(rank,weights=p)
print(c)    # choicesの戻値はリストになるので
print(c[0]) # [0]で先頭要素を取得する

choices 関数に k= のキーワード引数を設定すると、一度に \(k\) 個の要素を取得することができます。

%reset -f
import random as r
rank = ['LR','UR','SSR','SR','R']
p = [1,3,10,20,50]
c = r.choices(rank,weights=p,k=10) # ★k=10を設定
print(c)

上記のプログラムを実行すると変数 c には、次のように \(10\) 個の要素を持ったリストが格納されます。

['R', 'SSR', 'R', 'R', 'R', 'SR', 'LR', 'R', 'SR', 'SR']

14 課題03 (宿題)

今回の講義ノートの冒頭で示した課題03について、今回の講義で作成したノートブックのなかで取組み、その 共有リンクGoogle Classroom 経由で提出してください。共有リンクの作成方法は第03回講義で学習済みです。

img