Pythonで乱数を使って採点。ドラマDIVE!!で水泳飛び込み競技の採点をしてみた。

この記事を読むことで、 Pythonでの乱数の作り方、randrange、randintの違い、小数での乱数を発生させるuniformの使い方を学べます。乱数を7つ作って配列に格納します。また、下記の内容も同時に習得できます。

・基本的なループと内包表記でのループの書き方を対応
・リストに格納された乱数を昇順に並べ替える方法
・リストから必要な要素を取り出すスライスの使い方

・乱数を小数点1桁まで表示させる方法
・乱数を0.5刻みに発生させる方法
・関数を呼び出して戻り値として値を格納
・IF文の復習
・引数を関数に渡して分岐してメッセージを表示

サイトマップはこちらから

Python自作サンプル集へ
これからプログラミングを学ぶ方へ
プログラミングと資格へ
基本情報技術者試験トップへ
自己紹介

Pythonの進捗状況(私のロードマップ)

この記事では、プログラミングの具体例として、水泳の飛び込みの点数を求め方を用います。

飛び込みの採点は、採点者が7名で、0.0点から10.0点までを0.5点刻みで採点して、上位2つ、下位2つを除いた【真ん中の3つの点数の平均点】が、その選手の得点になります。その選手とは、「この記事をご覧のあなた自身」だと思って読み進めて行ってください。

ループでランダムな数の点数7つ分をリストに格納して、リストを昇順に並び替えます。
リストの添字は0から始まるので、添字0の要素が最低点、リストの最後の添字6の要素が最高点になります。点数の低い添字0,1と、点数が高い添字5,6は使いません。

なので、飛び込みの採点に必要な添字は、リストの真ん中の2,3,4になります。
これらの平均点が、選手の採点になります。

その点数によって、水泳飛び込み青春ドラマの麻木夏陽子コーチの評価が変わるよう、IF文で分岐させて表示しています。

まず、randomモジュールをインポートして、randintを使って0から10までの7つ乱数を発生させてリストに追加します。ループを7回回すことによって乱数発生とリストへの追加が可能になります

ループの基本のコードでの実行結果とコードです。

import random

#点数を格納するリストarrayを宣言
array=[]

#採点員7人分の点数を乱数で発生させ、その点数をリストarrayに格納
for i in range(7):
    array.append(random.randint(0,10))

print(array)

このループの部分を内包表記を使うことによって、シンプルに書き換えられます。
forの所を対応せせて見てください。内包表記でのコードと実行結果です。
リストarrayの宣言も一緒に1行にまとめられます。

import random

#ここが【内包表記】
array=[random.randint(0,10) for i in range(7)]

print(array)

では次に、randrangeで1から10までの乱数を同じように発生させます。ただし、書き方は、

random.randrange(1,11)

と書いて、11未満すなわち、1〜10までの乱数を発生させます。
コードと実行結果です。

import random

#randrangeでの【引数の最後を11】と指定している
array=[random.randrange(0,11) for i in range(7)]

print(array)

このように、randintとrandrangeでは引数の指定の仕方が異なります。
では、「0〜10.0」までの範囲で小数点を含む数の乱数を発生させるには、

random.uniform(0,10.0)

になります。
コードと実行結果です。

import random

#0〜10.0までの小数を7つ発生させている
array=[random.uniform(0,10.0) for i in range(7)]

print(array)

数えると7つの乱数が発生出来ているのですが、桁が多すぎてなんだか分かんないですね。
そこで、小数点1桁まで表示させるよう、round関数で指定します。

round(数値,桁数)

コードと実行結果です。

import random

#roundで乱数を小数点1桁まで表示
array=[round(random.uniform(0,10),1) for i in range(7)]

print(array)

では、更に0.5刻みで求めます。
求めた乱数に2を掛けて、それをint関数で整数にしてから2で割ると0.5刻みになります。

int(乱数*2)/2

コードと実行結果です。

import random

#乱数に2を掛けた数をint関数で整数にしてから2で割る
array=[int(round(random.uniform(0,10),1)*2)/2 for i in range(7)]

print(array)

では、飛び込みの点数を求めるために、このリストを昇順に並び替えます。
先に実行結果を掲載します。

print(‘昇順に並び替える【前】\n’+str(array))

「昇順に並び替えるの前」と表示して改行とリストを連結させるのに、
バックスラッシュnで改行をして、str関数を使って表示させます。
Macの方は【option】+【¥】でバックスラッシュが表示されます。

sortedで並び替えを行います。

array=sorted(array)

あとは並び替え後のリストを表示します。
ここまでのコードです。

import random

#乱数に2を掛けた数をint関数で整数にしてから2で割る
array=[int(round(random.uniform(0,10),1)*2)/2 for i in range(7)]

#並び替える前のリストを表示
print('昇順に並び替える【前】\n'+str(array))

#リストを昇順に並び替え
array=sorted(array)

#並び替えた後のリストを表示
print('昇順に並び替えた【後】\n'+str(array))

では、スライスを使って、mid_arrayというリストに、添字2,3,4のみを格納します。
スライスの使い方は下記のように[2:5]と指定すると2から5未満、つまり、2,3,4の中央値3つが入ります。

mid_array=array[2:5]

では、3つの中央値の平均を求めます。
Pythonでは、このたった1行で求まります。

score=round(sum(mid_array)/len(mid_array),1)

これは、リストmid_arrayの合計を求めて、長さが3となるlen(mid_array)で割ることによって、平均点を求めています。

import random

#乱数に2を掛けた数をint関数で整数にしてから2で割る
array=[int(round(random.uniform(0,10),1)*2)/2 for i in range(7)]

#並び替える前のリストを表示
print('昇順に並び替える【前】\n'+str(array))

#リストを昇順に並び替え
array=sorted(array)

#並び替えた後のリストを表示
print('昇順に並び替えた【後】\n'+str(array))

#スライスを使ってリストから中央の値のみを残す
mid_array=array[2:5]

#リストの中央値のみを出力
print('リストの【中央値】のみ\n'+str(mid_array))

#3つの中央値から平均点を求めて、それを選手の得点とする
score=round(sum(mid_array)/len(mid_array),1)

#選手の点数を表示
print('あなたの飛び込みの点数は【'+str(score)+'】点です。')

では、ここまでの処理を関数にして呼び出せるように書き換えました。
関数にしておくと、各処理の管理が便利になります。
関数名はscoringにしました。最後の行で関数を呼び出しています。

import random

#飛び込みの採点をする関数
def scoring():

    #7人の採点員の点数を0.0〜10.0まで0.5刻みの乱数を発生させて求めている
    array=[int(round(random.uniform(0,10),1)*2)/2 for i in range(7)]

    #並び替える前のリストを表示
    print('昇順に並び替える【前】\n'+str(array))

    #リストを昇順に並び替え
    array=sorted(array)

    #並び替えた後のリストを表示
    print('昇順に並び替えた【後】\n'+str(array))

    #スライスを使ってリストから中央の値のみを残す
    mid_array=array[2:5]

    #リストの中央値のみを出力
    print('リストの【中央値】のみ\n'+str(mid_array))

    #3つの中央値から平均点を求めて、それを選手の得点とする
    score=round(sum(mid_array)/len(mid_array),1)

    #選手の点数を表示
    print('あなたの飛び込みの点数は【'+str(score)+'】点です。')

    #得点を戻り値として、呼び出し元に戻る
    return score


#採点する関数scoringを呼び出してスコアを変数scoreに代入する
score=scoring()

実行結果です。

次に、麻木夏陽子コーチが、あなたの得点に応じて評価をします。
点数が5.0未満、7.0未満、8.0未満、その他(高得点を得ると麻木夏陽子コーチから「ハートマークが!」)
麻木コーチが評価する関数をjudgeとします。
下記がコードです。

#麻木夏陽子コーチの評価の分岐の関数
def judge(x):
    if x<5.0:
        msg='辞めるの!?'
    elif(x<7.0):
        msg='覚悟しなさい!!'
    elif(x<8.0):
        msg='やるじゃない。'
    else:
        msg='さすがね(ハート)あなたしかない武器がある!!'            

    print('麻木夏陽子コーチ:「'+msg+'」')

先ほど作った採点する関数から、あなたの飛び込みの得点が求まりました。
その得点を引数にして、今回の関数judgeを呼び出して仮引数としてxに渡して、点数によって麻木コーチからの評価が分岐されます。

では、全てのコードです。

import random

#飛び込みの採点をする関数
def scoring():

    #7人の採点員の点数を0.0〜10.0まで0.5刻みの乱数を発生させて求めている
    array=[int(round(random.uniform(0,10),1)*2)/2 for i in range(7)]

    #並び替える前のリストを表示
    print('昇順に並び替える【前】\n'+str(array))

    #リストを昇順に並び替え
    array=sorted(array)

    #並び替えた後のリストを表示
    print('昇順に並び替えた【後】\n'+str(array))

    #スライスを使ってリストから中央の値のみを残す
    mid_array=array[2:5]

    #リストの中央値のみを出力
    print('リストの【中央値】のみ\n'+str(mid_array))

    #3つの中央値から平均点を求めて、それを選手の得点とする
    score=round(sum(mid_array)/len(mid_array),1)

    #選手の点数を表示
    print('あなたの飛び込みの点数は【'+str(score)+'】点です。')

    #得点を戻り値として、呼び出し元に戻る
    return score


#麻木夏陽子コーチの評価の分岐の関数
def judge(x):
    if x<5.0:
        msg='辞めるの!?'
    elif(x<7.0):
        msg='覚悟しなさい!!'
    elif(x<8.0):
        msg='やるじゃない。'
    else:
        msg='さすがね(ハート)あなたしかない武器がある!!'            

    print('麻木夏陽子コーチ:「'+msg+'」')


#採点する関数scoringを呼び出してスコアを変数scoreに代入する
score=scoring()

#麻木夏陽子コーチがあなたを評価する関数judgeを呼び出す
judge(score)

では、実行します。

悲し〜〜〜〜

はい!コーチ!!

やる気ガッツガツ!!!

嬉しすぎて言葉が出なくて、*@$%&+++++++++++++!!!

今回扱ったプログラミングの具体例は、水泳の飛び込みの青春ドラマでHiHiJetの井上瑞稀さん、作間龍斗さん、高橋優斗さんのトリプル主演のドラマです。

私の推し、麻木コーチ役は、馬場ふみかさん!
麻木夏陽子で「かよこ」だから、小宮プロからは「かよごん」って呼ばれていて、ボケツッコミが面白かったです。

ドラマDIVEの相関図です。
この相関図は公式なものではなく、私がパソコンを買い換えたことをきっかけにPowerPointで作ってみた私的な作品です。

以下、ドラマDIVEのサイトです。

公式サイト
公式アメブロ

チョコランマ級に大好きな、ふみふみ(=馬場さん)の色気が目の保養です(=^x^=)このドラマの感想(ネタバレ含む)はアメブロのこちらに書きました。

放送前
第2話
第3話
第4話
第5話
第6話
第7話

好きなことを題材にプログラミングをするのって、時間が経つのを忘れるぐらい面白いですね。気づいたら外、真っ暗です(=^x^=)

このプログラムを利用した続編として、麻木コーチが3人の中から代表を選ぶプログラムも作りました。

馬場ふみかさんの写真集 ■

同じ人類で、ここまで美しい女性がいるのかと、感動しました!!
最強の被写体であり、たっぷりと曲線美が堪能できます。
「スタイル抜群」とか「ナイスボディ」などといった言葉ではとても収まりきらない程の美しさで、まさに神の造形です。
女性の方で、ファッションに興味のある方でしたら服(水着も含め)の着こなし方や見せ方、角度、ポーズ、表情など凄く勉強になりますので、男女ともに楽しめる写真集です。「好きな男性を振り向かせたい」という女性の方にとって、女性としてのお手本になる写真集だと思います。
私は、資格試験やプログラミング学習のリフレッシュに、馬場ふみかさんの写真集を見て、目の保養にしています。参考書と共に、馬場ふみかさんの写真集を勉強のお供にしていて、楽しく勉強が出来たお陰で、実際にIT系国家資格の基本情報技術者試験(以下FE)に高得点一発合格(点数)出来ました。
20年以上前の平成初期ぐらいに(大学生〜新社会人の頃)情報二種や初級シスアドに2度も落ちてしまった私でさえFEに1発合格が出来たのは、精神的な面で、馬場ふみかさんの写真集やドラマやCM、SNSなどの芸能活動が支えになったからです。
私にとって馬場ふみかさんは、まさに勝利の女神様です!!

■ 参考文献の紹介 ■
じっくり丁寧にPythonを学びたい方向けの書籍を紹介します。

Pythonを基礎から中級程度まで丁寧に学びたい方におすすめの書籍です。
まずはpaizaラーニングなどの学習コンテンツで1〜2巡(苦手な所は納得がいくまで何巡でも)してからこの本で学ぶと、自分の学習状況をブログなどでアウトプット出来るようになり、また、エラーなどの不明点を調べられる力もついていきます。

サイトマップはこちらから

Python自作サンプル集へ
これからプログラミングを学ぶ方へ
プログラミングと資格へ
基本情報技術者試験トップへ
自己紹介

Pythonの進捗状況(私のロードマップ)

投稿者: nekosiestr

プログラミング学習中の発達障害者です。宜しくお願いします。 趣味で写真を撮っています。 プログラミングは、GAS/HTML/CSS/JavaScript/jQuery/PHP、 発達障害は、自閉症スペクトラムASD/ADHD、 写真は、以前はコンパクトデジカメ、現在は、OLYMPUSミラーレス一眼を使っています。