« パイクカー専門店? | トップページ | キメる。 »

2021年2月20日 (土)

プログラミングな話

IT担当のやまもとは普段プログラミングとかをやっています。

本日はプログラミングについて知ってもらうために実例を交えて紹介させていただきます。


以下は、Python(パイソン)というプログラミング言語で書かれたコードです。
-----------------------------------------------
rad = 6371000
tall = 1.65

d = (((rad + tall)**2) - (rad**2))**0.5 / 1000

print(d)
-----------------------------------------------

このコードを実行すると、下の数がでます。
-----------------------------------------------
4.585226573089109
-----------------------------------------------

ちんぷんかんぷんですよね。
上のコードは、「身長165cmの人が見る水平線までの距離」を計算する命令を記述しています。
実行結果が4.58……なので、身長165cmの人はだいたい約4.6km先のものまで見えるということになるのです。

各行についてかんたんに説明していきます。

rad = 6371000
↑地球の半径は6371kmですので、メートルになおした6371000をradという名前の変数に格納しています。「半径」は英語で「radius」ですのでわかりやすいようにradとしましたが、別にhankeiでもhogeでもaaaaでもなんでも構いません。

tall = 1.65
↑身長165cmの人の身長をメートルで表したいので、tallという変数を作ってそれに1.65を格納しています。「身長」は英語で「tall」ですのでわかりやすいようにtallとしましたが、別にshinchoでもhonyararaでもbbbbでもなんでも構いません。

x = (((rad + tall)**2) - (rad**2))**0.5 / 1000
↑中学校の数学で習った「三平方の定理」を使っています。 xの二乗 + yの二乗 = zの二乗のやつです。
今回の場合、xとzの長さはわかっているので移項してyの二乗 = zの二乗 - xの二乗の形にしています。

print(d)
↑計算結果を画面に表示するための命令です。

中学生レベルの数学知識があれば、この程度のプログラムなら誰でもかんたんに書けてしまうのです!!

プログラミングのすごい点はずばり、「人間がやろうとすると面倒くさいことを、コンピュータが一瞬でこなしてくれる」ことです!!
「身長165cmの人が見る水平線までの距離」を筆算で求めようとすると結構な時間がかかりますが、プログラミングを使えば命令文さえ記述してしまえば答えは一瞬で出ます。
また、身長180cmの人の場合を求めたければ「tall」に入れる数を「1.8」にするだけですし、
火星で同じことをやった場合を求めたければ「rad」に入れる数を「3389500」に変えるだけでいいんです。

Ws000002 

いま、「地平線までの距離がわかっても生活に役立たないじゃん!」って思いませんでしたか?
ではもう少し生活に役立ちそうなことをしてみましょう。(少し長くなります)

-----------------------------------------------
import random
import datetime

#salary
in_salary = 250000
in_bonus = 600000

#daily
out_morning = 200
out_lunch = 600
out_dinner = 800

#weekly
out_gasoline = 6000

#monthly
out_cellphone = 9000
out_internet = 5000
out_rent = 80000
out_electric = 8000
out_gas = 3000
out_water = 1500
out_smoke = 5000
out_entertainment = 10000

#banking
out_bank = 50000

#accidental
out_medical = 8000
out_accident = 100000

#random range
rand_min = 0.8
rand_max = 1.2

d = datetime.date.today()
x = 300000
y = 0

for days in range(365):
  if d.day == 1:
    sal = random.randint(in_salary * rand_min, in_salary * rand_min)
    x = x + sal
    print(str(d) + ' 給料:' + str(sal) + '円ゲット!')
    print(str(d) + ' 現在の所持金:' + str(x) + '円')

  if random.randint(1, 100) <= 5:
    bonus = random.randint(in_bonus * rand_min, in_bonus * rand_min)
    x = x + bonus
    print(str(d) + ' ラッキー!!ボーナスが' + str(bonus) + '円でた!!!!!!!!!!!!!!!!!!!!!')
    print(str(d) + ' 現在の所持金:' + str(x) + '円')

  if d.day % 7 == 0:
    gasoline = random.randint(out_gasoline * rand_min, out_gasoline * rand_min)
    x = x - gasoline
    print(str(d) + ' ガソリン代で' + str(gasoline) + '円なくなった……')
    print(str(d) + ' 現在の所持金:' + str(x) + '円')

  if d.day == 25:
    cell = random.randint(out_cellphone * rand_min, out_cellphone * rand_min)
    inter = random.randint(out_internet * rand_min, out_internet * rand_min)
    rent = random.randint(out_rent * rand_min, out_rent * rand_min)
    elec = random.randint(out_electric * rand_min, out_electric * rand_min)
    gas = random.randint(out_gas * rand_min, out_gas * rand_min)
    water = random.randint(out_water * rand_min, out_water * rand_min)
    smoke = random.randint(out_smoke * rand_min, out_smoke * rand_min)
    ent = random.randint(out_entertainment * rand_min, out_entertainment * rand_min)

    x = x - (cell + inter + rent + elec + gas + water + smoke + ent + out_bank)
    y = y + out_bank

    print(str(d) + ' 携帯代で' + str(cell) + '円なくなった……')
    print(str(d) + ' インターネット回線利用料金で' + str(inter) + '円なくなった……')
    print(str(d) + ' 家賃で' + str(rent) + '円なくなった……')
    print(str(d) + ' 電気代で' + str(elec) + '円なくなった……')
    print(str(d) + ' ガス代で' + str(gas) + '円なくなった……')
    print(str(d) + ' 水道代で' + str(water) + '円なくなった……')
    print(str(d) + ' タバコ代で' + str(smoke) + '円なくなった……')
    print(str(d) + ' 遊興費で' + str(ent) + '円なくなった……')
    print(str(d) + ' ' + str(out_bank) + '円貯金した')
    print(str(d) + ' 現在の所持金:' + str(x) + '円')

  if random.randint(1, 100) <= 75:
    morning = random.randint(out_morning * rand_min, out_morning * rand_max)
    x = x - morning
    print(str(d) + ' 朝食代で' + str(morning) + '円使った')
  else:
    print(str(d) + ' 今日は朝食を抜いた')

  lunch = random.randint(out_lunch * rand_min, out_lunch * rand_max)
  x = x - lunch
  print(str(d) + ' 昼食代で' + str(lunch) + '円使った')

  dinner = random.randint(out_dinner * rand_min, out_dinner * rand_max)
  x = x - dinner
  print(str(d) + ' 夕食代で' + str(dinner) + '円使った')

  if random.randint(1, 100) <= 3:
    med = random.randint(out_medical * rand_min, out_medical * rand_max)
    x = x - med
    print(str(d) + ' 風邪をひいて病院で' + str(med) + '円掛かった……')

  if random.randint(1, 10000) <= 5:
    acc = random.randint(out_accident * rand_min, out_accident * rand_max)
    x = x - acc
    print(str(d) + ' 不慮の事故で入院費' + str(acc) + '円掛かった……')

  d = d + datetime.timedelta(days=1)

  print(str(d) + ' 最終的に手元に' + str(x) + '円残った!')
  print(str(d) + ' 最終的に' + str(y) + '円貯金できた!')
-----------------------------------------------

実行結果は非常に長くなるので省略していますが、こんな感じになります。
-----------------------------------------------
2021-02-20 今日は朝食を抜いた
2021-02-20 昼食代で484円使った
2021-02-20 夕食代で756円使った
2021-02-21 ガソリン代で4800円なくなった……
2021-02-21 現在の所持金:293960円
2021-02-21 今日は朝食を抜いた
2021-02-21 昼食代で574円使った
2021-02-21 夕食代で746円使った
2021-02-22 朝食代で238円使った
2021-02-22 昼食代で500円使った
2021-02-22 夕食代で875円使った
2021-02-23 今日は朝食を抜いた
2021-02-23 昼食代で517円使った
2021-02-23 夕食代で765円使った
2021-02-23 風邪をひいて病院で7020円掛かった……
2021-02-24 今日は朝食を抜いた
2021-02-24 昼食代で703円使った
2021-02-24 夕食代で705円使った
2021-02-25 携帯代で7200円なくなった……
2021-02-25 インターネット回線利用料金で4000円なくなった……
2021-02-25 家賃で64000円なくなった……
2021-02-25 電気代で6400円なくなった……
2021-02-25 ガス代で2400円なくなった……
2021-02-25 水道代で1200円なくなった……
2021-02-25 タバコ代で4000円なくなった……
2021-02-25 遊興費で8000円なくなった……
2021-02-25 50000円貯金した
2021-02-25 現在の所持金:134117円
2021-02-25 今日は朝食を抜いた
2021-02-25 昼食代で498円使った
2021-02-25 夕食代で895円使った
(中略)
2021-11-01 給料:200000円ゲット!
2021-11-01 現在の所持金:172899円
2021-11-01 ラッキー!!ボーナスが480000円でた!!!!!!!!!!!!!!!!!!!!!
2021-11-01 現在の所持金:652899円
(中略)
2022-02-16 今日は朝食を抜いた
2022-02-16 昼食代で621円使った
2022-02-16 夕食代で931円使った
2022-02-17 朝食代で208円使った
2022-02-17 昼食代で634円使った
2022-02-17 夕食代で642円使った
2022-02-18 朝食代で219円使った
2022-02-18 昼食代で693円使った
2022-02-18 夕食代で851円使った
2022-02-19 朝食代で199円使った
2022-02-19 昼食代で523円使った
2022-02-19 夕食代で647円使った
2022-02-20 最終的に手元に531591円残った!
2022-02-20 最終的に600000円貯金できた!
-----------------------------------------------

上記のコードは、
・最初の手持ちは30万円
・毎月1日に給料として25万円が入る
・毎月1日に5%の確率でボーナス60万円が入る
・毎週ガソリン代で6000円前後使う
・毎月25日に生活費(携帯代、インターネット回線利用料金、家賃、電気代、ガス代、水道代、タバコ代、遊興費)として手持ちからそれぞれ設定された金額を引かれる
・毎月25日に5万円銀行に貯金する
・毎日朝食、昼食、夕食をそれぞれ、予算200円、600円、800円で摂る。ただし、朝食は25%の確率で抜く
・毎日3%の確率で風邪をひいて病院で8000円前後使う。
・毎日0.05%の確率で事故に遭い入院費として10万円前後使う。
・手持ちの金額が変動する場合は、それぞれの名目に設定された金額の±20%の範囲でランダムで決まる。例えばガソリン代は設定金額は6000円だが、4800円~7200円の間でランダムに変動する
・上記の試行を本日の日付から1年分(365日)行う

という条件のシミュレーションです。
なかなかお金に余裕のある生活をしていますね(怒)
一年で60万円貯金できて、しかも手元に53万円残ってます。
今回はウハウハな結果でしたが、ボーナスが入らなかった場合や、たまたま乱数が悪くてお金を多く使いすぎたり、10000回に5回起こる不慮の事故を引くと最終的に手持ちがマイナスになったりもします。悲しいですね。

上の条件に、「毎月0.0001%の確率で宝くじが当たって3億円ゲット!!」とか入れても面白いかもしれませんね。
「飛行機事故に遭う確率」とか「遠い親戚の遺産が入る確率」とか、現実世界で起こりうるすべての事象を網羅することができれば、この上なく正確なシミュレーションができることになります。

ちなみにPythonはgoogleアカウントを持っていれば特別な準備がなくても誰でも気軽に触れる言語ですので、お子様の教育にいかがでしょうか?

 

やまもとでした。

« パイクカー専門店? | トップページ | キメる。 »

くだらんお話」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« パイクカー専門店? | トップページ | キメる。 »

フォト

facebook

2021年4月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  
無料ブログはココログ

ウェブページ