乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

プログラミング

さて
今回は確率のお話です。


「ロト7」の1等、同じ売り場から3口も当選

なんてニュースが最近有ったので
いろいろなギャンブルの確率が
どのくらいなのかを求めてみたくなりました。

解説動画はこちら



まずは競馬からです。

競馬は16-18頭の馬の中から
着順を当てる仕組みです。

馬券は正式には
勝ち馬投票券と言うらしいです。

16頭18頭だてでそれぞれを求めました。

確率計算にはPythonを用いますので
ライブラリをインポートします。

import math
import itertools
こちらを用います。

さて、まずは単勝から
単に1着を当てるもの

確率は
# 16頭
print('{0}/{1}'.format(1, 16))
print('{0:.5}%'.format(1/16*100))
1/16
6.25%
# 18頭
print('{0}/{1}'.format(1, 18))
print('{0:.5}%'.format(1/18*100))
1/18
5.5556%

次は複勝
1-3着に入る馬を当てます。

予想した馬が1位でも3位でも良いので
単純に単勝の3倍になります。
# 16頭
print('{0}/{1}'.format(3, 16))
print('{0:.5}%'.format(3/16*100))
3/16
18.75%
# 18頭
print('{0}/{1}'.format(3, 18))
print('{0:.5}%'.format(3/18*100))
3/18
16.667%


複勝であれば
6回に1回は当たるという確率ですね。

ただし払い戻しは平均2倍程度なので
あまり美味しくはありません。

お次は枠連
18頭の馬は9の枠に入れられます。
それぞれ1-2頭ほどで構成され
その枠での順位を当てるというものです。

9枠の中から2枠を選ぶというものです。

Pythonでの
組み合わせの求め方は2通りありますが
len(list(itertools.combinations(range(9),2)))

math.factorial(9) // (math.factorial(9 - 2) * math.factorial(2))
どちらであっても36通りです。

ということで確率は
waku = math.factorial(9) // (math.factorial(9 - 2) * math.factorial(2))
print('{0}/{1}'.format(1, waku))
print('{0:.5}%'.format(1/waku*100))
1/36
2.7778%

となります。


お次は馬単と馬連
選んだ2頭が1-2着になる組み合わせで
馬単は1-2着をそのまま当てる
馬連は1-2,2-1どちらでも良いという買い方です。

当然
馬連は馬単の2倍の確率になります。

馬練:
# 16頭
umaren= math.factorial(16) // (math.factorial(16 - 2) * math.factorial(2))
print('{0}/{1}'.format(1, umaren))
print('{0:.5}%'.format(1/umaren*100))
1/120
0.83333%
# 18頭
umaren= math.factorial(18) // (math.factorial(18 - 2) * math.factorial(2))
print('{0}/{1}'.format(1, umaren))
print('{0:.5}%'.format(1/umaren*100))
1/153
0.65359%

馬単:
# 16頭
umatan= math.factorial(16) // math.factorial(16 - 2)
print('{0}/{1}'.format(1, umatan))
print('{0:.5}%'.format(1/umatan*100))
1/240
0.41667%
# 18頭
umatan= math.factorial(18) // math.factorial(18 - 2)
print('{0}/{1}'.format(1, umatan))
print('{0:.5}%'.format(1/umatan*100))
1/306
0.3268%


お次はワイド
3着以内に入る組み合わせのうち2つを
それらの着順に依らず順不同で予想するものです。

1-2 , 1-3 , 2-3着になれば良いので
単純に馬連の3倍の確率になります。

# 16頭
wide = math.factorial(16) // (math.factorial(16 - 2) * math.factorial(2))
print('{0}/{1}'.format(3, wide))
print('{0:.5}%'.format(3/wide*100))
3/120
2.5%
# 18頭
wide = math.factorial(18) // (math.factorial(18 - 2) * math.factorial(2))
print('{0}/{1}'.format(3, wide))
print('{0:.5}%'.format(3/wide*100))
3/153
1.9608%


次は3連
3連単と3連複でそれぞれ
3連単:1着・2着・3着になる組み合わせを着順通りに予想する
3連複:1着・2着・3着になる組み合わせを順不同で予想する

3連複:は組み合わせ(16C3 , 18C3)
3連単:は順列(16P3 , 18P3)でもとめることになります。


3連複:
# 16頭
sanrenhuku = math.factorial(16) // (math.factorial(16 - 3) * math.factorial(3))
print('{0}/{1}'.format(1, sanrenhuku))
print('{0:.5}%'.format(1/sanrenhuku*100))
1/560
0.17857%
# 18頭
sanrenhuku = math.factorial(18) // (math.factorial(18 - 3) * math.factorial(3))
print('{0}/{1}'.format(1, sanrenhuku))
print('{0:.5}%'.format(1/sanrenhuku*100))
1/816
0.12255%


3連単:
# 16頭
sanrentan= math.factorial(16) // math.factorial(16 - 3)
print('{0}/{1}'.format(1, sanrentan))
print('{0:.5}%'.format(1/sanrentan*100))
1/3360
0.029762%
# 18頭
sanrentan= math.factorial(18) // math.factorial(18 - 3)
print('{0}/{1}'.format(1, sanrentan))
print('{0:.5}%'.format(1/sanrentan*100))
1/4896
0.020425%

このくらいの確率になると
でたらめに選んで買っても
5千回に1回しか当たりません。

そうとう当たらないので
当てるには絞り込みの技術が必要になってきます。

競馬の最後はWIN5
JRAが指定する5つのレース
それぞれの1着を予想するものです。

単勝の5乗ですね。

その確率は
win5 = 18**5
print('{0}/{1}'.format(1, win5))
print('{0:.10F}%'.format(1/win5*100))
1/1889568
0.0000529221%

約190万分の1の確率です。
当てた際の
払戻金の想定額が2億円ほどで

宝くじなどの確率が
1000万分の1の確率で
同じくらいの金額なので

WIN5の方が期待値は上かと思います。


競馬の確率の高さは

複勝>単勝>枠連>ワイド>馬連>馬単>3連複>3連単>WIN5

になります。

次は宝くじのうち
ロト6です。

ロト6は1-43まで数字のうち
本数字6個と1個のボーナス数字
計7個の数字を選択して当てるものです。

1-5等まであります。

まずは1等

本数字6個すべて一致

なので単純に
43C6 となります。
この数はロト6のベースとなる数です。

求め方は
loto_base = math.factorial(43) // (math.factorial(43 - 6) * math.factorial(6))
print('{0}/{1}'.format(1, loto_base))
print('{0:.10f}%'.format(1/loto_base*100))
1/6096454
0.0000164030%

1等は約600万分の1の確率となります。

2等以下は次のようになります。

2等 : 本数字5個と一致,ボーナス数字1個と一致
loto_base = math.factorial(43) // (math.factorial(43 - 6) * math.factorial(6))
print('{0}/{1}'.format(6, loto_base))
print('{0:.10f}%'.format(6/loto_base*100))
6/6096454
0.0000984179%

3等 : 6個のうち5個が本数字に一致
loto_base = math.factorial(43) // (math.factorial(43 - 6) * math.factorial(6))
loto3 = (math.factorial(6) // (math.factorial(6 - 5) * math.factorial(5)))*37-6
print('{0}/{1}'.format(loto3, loto_base))
print('{0:.10f}%'.format(loto3/loto_base*100))
216/6096454
0.0035430432%

4等 : 6個のうち4個が本数字に一致
loto_base = math.factorial(43) // (math.factorial(43 - 6) * math.factorial(6))
loto4 = (math.factorial(6) // (math.factorial(6 - 4) * math.factorial(4)))* \
((math.factorial(37) // (math.factorial(37 - 2) * math.factorial(2))))
print('{0}/{1}'.format(loto4, loto_base))
print('{0:.10f}%'.format(loto4/loto_base*100))
9990/6096454
0.1638657488%

5等 : 6個のうち3個が本数字に一致
loto_base = math.factorial(43) // (math.factorial(43 - 6) * math.factorial(6))
loto5 = (math.factorial(6) // (math.factorial(6 - 3) * math.factorial(3)))* \
((math.factorial(37) // (math.factorial(37 - 3) * math.factorial(3))))
print('{0}/{1}'.format(loto5, loto_base))
print('{0:.10f}%'.format(loto5/loto_base*100))
155400/6096454
2.5490227598%

さて
5等は1000円です。
2.5%の確率でしか当たらないので
40回買っても1000円しか戻ってこないのです。

1位がでなければキャリーオーバーで
持ち越しになり、金額が増えますが
そもそも600万分の1の確率では
人生において当たることは
ほぼないでしょうね。


今回のラストはポーカーです。

ポーカーはトランプ52枚を使ったゲームで
役が決まっています。

その役がどれだけ有るのかを求めます。

役は
一番強い役がロイヤルフラッシュ
(ロイヤルストレートフラッシュ)

ストレートフラッシュ: 連続した数字で(絵柄)
同じスートの5枚のカード。

ストレートフラッシュ同士の場合は、
最もランクが高いカードを持つプレイヤーが勝者
最も強いストレートフラッシュは同じスートのA-K-Q-J-10

フォーカード: 同じランクのカード4枚と他1枚カード
フォーカード同士の場合は、同じランクのカード
4 枚のランクが最も高いプレイヤーが勝者

フルハウス: 同じランクのカード 3 枚と別の同じランクのカード 2 枚。
(スリーカードとワンペアの組み合わせ)
フルハウス同士の場合は、3 枚 1 組のカードのランクが最も高いプレイヤーが勝者

フラッシュ: 同じスートの 5 枚のカード。
フラッシュ同士の場合は、最もランクが高いカードを持つプレイヤーが勝者

ストレート: 連続した数字の 5 枚のカード。
ストレート同士の場合は、最もランクが高いカードを持つプレイヤーが勝者
最も強いストレートは A-K-Q-J-T (エースハイ)、最も弱いストレートは 5-4-3-2-A (ファイブハイ)

スリーカード: 同じランクのカード 3 枚と、ランクの異なる 2 枚のサイドカード。
スリーカード同士の場合は、3 枚 1 組のカードのランクが最も高いプレイヤーが勝者

ツーペア: 同じランクのカード 2 枚 1 組が 2 組と、1 枚のサイドカード。
ツーペア同士の場合は、最もランクが高いペアを持つプレイヤーが勝者

ワンペア: 同じランクのカード 2 枚と、ランクの異なる 3 枚のサイドカード。
ワンペア同士の場合は、最もランクが高いペアを持つプレイヤーが勝者

ハイカード: 上記のどれにも当てはまらない手札。
ブタとも言います。

今回は役を判定するプログラムを作って
全カードの組み合わせからその役がなんなのかを判定して
役の組み合わせ数を求めます。

デッキはカード52枚として
それを判定する関数を作成し
全52枚の中から5枚を選んだ際の組み合わせから
役が何かを求めて役の個数をカウントします。
# デッキの生成
deck=[b+':'+str(a) for a in range(1,14) for b in ['C','S','D','H']]
# 役の判定
def jadge_role(card):
    s = {}
    for c in card:
        k = int(c.split(':')[1])
        if k in s:
            s[k]+=1
        else:
            s[k] =1
    t = {c.split(':')[0] for c in card}
    n = sorted([c for c in s.keys()])
    if len(t)==1 and all([1 in n,10 in n ,11 in n,12 in n,13 in n]):
        return 'RSF'
    if len(t)==1 and (all([1 in n,10 in n ,11 in n,12 in n,13 in n]) or
             (max(n)-min(n)==4) and len(s)==5):
        return 'SF'
    if 4 in s.values():
        return '4C'
    if 3 in s.values() and 2 in s.values():
        return 'FH'
    if len(t)==1:
        return 'FL'
    if (all([1 in n,10 in n ,11 in n,12 in n,13 in n]) or
             (max(n)-min(n)==4) and len(s)==5):
        return 'ST'
    if 3 in s.values():
        return '3C'
    if list(s.values()).count(2)==2:
        return '2P'
    if list(s.values()).count(2)==1:
        return '1P'
    return 'BT'
# 組み合わせを計算
cards = itertools.combinations(deck,5)
calc_dict = {}
for card in cards:
    role = jadge_role(card)
    if role in calc_dict:
        calc_dict[role] += 1
    else:
        calc_dict[role]   = 1

# 結果
poker_base = math.factorial(52) // (math.factorial(52 - 5) * math.factorial(5))
print(poker_base)
for k,v in sorted(calc_dict.items(),reverse=True,key=lambda x:x[1]):
    print(k,'\t',v,'\t','{0:.10f}%'.format(v/poker_base*100))
2598960

BT  1302540 50.1177394035%
1P  1098240 42.2569027611%
2P    123552 4.7539015606%
3C      54912 2.1128451381%
ST      10200 0.3924646782%
FL         5108 0.1965401545%
FH        3744 0.1440576230%
4C          624 0.0240096038%
SF            36 0.0013851695%
RSF           4 0.0001539077%

このような結果になります。
ロイヤルストレートフラッシュは
約64万回に1回ほどは出る計算ですね

フラッシュとストレートでは
ストレートの方が2倍も出る確率が高いのです。
なのでどちらかを迷う場合は
確率の高いストレートを狙うというのが
戦略になるのかもしれませんね。


いろいろなギャンブルにまつわる
組み合わせと確率を求めてみました。

次は
戦略なども考えていきたいかなと思っております。

それでは

新しい元号が決まり

令和

その由来は「万葉集」ということで
今回は万葉集のデータを使って
文章生成で遊んでみました。


まずは
万葉集のデータを用意しましょう。

テキストでも
エクセルでも
なんでも良いです。

手に入れたら
Pythonの文字列型にしておきましょう。

 '篭毛與 美篭母乳 布久思毛與 美夫君志持 
此岳尓 菜採須兒 家吉閑名 告紗根 虚見津
山跡乃國者 押奈戸手 吾許曽居 師吉名倍手
吾己曽座 我許背齒 告目 家呼毛名雄母', '山常庭 村山有等 取與呂布 天乃香具山
騰立 國見乎為者 國原波 煙立龍
海原波 加萬目立多都 怜A國曽 蜻嶋 八間跡能國者',
・・・

自分は一旦リストに格納してから
これを連結しました。
text = '.\n'.join(m_list)


さて、今回は
マルコフ連鎖というものを用いて
文章生成を行います。

マルコフ連鎖とは・・・
wikiによると
マルコフ連鎖 出典:
フリー百科事典『ウィキペディア(Wikipedia)』
マルコフ連鎖(英: Markov chain)とは、
確率過程の一種であるマルコフ過程のうち、
とりうる状態が離散的なものをいう。

また特に、時間が離散的なものを指すことが多い。

マルコフ連鎖は、未来の挙動が現在の値だけで決定され、
過去の挙動と無関係である。

各時刻において起こる状態変化に関して、
マルコフ連鎖は遷移確率が過去の状態によらず、
現在の状態のみによる系列である。

特に重要な確率過程として、
様々な分野に応用される。

・・・・

ちょっと何言ってるか
わかんないっす!!!

簡単にいうと
次の図のように
mannyou.002

文章をたくさん読み込んだ後にある一節を取り出し
そこに繋がる単語(文章)などを確率で選んで
どんどん文をつなげます。

句読点などの文の終わりに続くものが選ばれたら
そこで一文が終了となります。

よく使われる言い回しは
たくさん出てきてしまう感じですね。

さて
マルコフ連鎖を
Pythonで取り扱う場合は
markovify というライブラリが必要です。

pip install markovify

などでインストールできます。

使い方も簡単です。
ライブラリを読み込んで。

文章を文字列型にして
それを使ってマルコフモデルを生成します。

import markovify
text_model = markovify.Text(text)

マルコフモデルを作ったら
あとは文章生成です。

これも非常に簡単で
マルコフモデルのメソッド

make_short_sentence(文字数,max_overlap_ratio=かぶり率)

とすると文が生成されます。
かぶり率のデフォルトが0.7
70%は元の文章とかぶるようですね。

元の文章と全く同じにならないような文にするには
このかぶり率を下げるといいでしょう。

下げすぎた場合は
文章が生成できないことがあり
その際は None が返ってきてしまいます。

古文だから
11個文章を作るようにしました。

ソースはこちら

# マルコフ連鎖で生成
r_dict = {}
for _ in range(1000):
    result = text_model.make_short_sentence(50,max_overlap_ratio=0.7)
    if result is not None:
        r_dict[result]=''
        if len(r_dict)==11:
            break

for i,t in enumerate(r_dict.keys(),start=1):
    print(i)
    for g in t.replace('.','').split(' '):
        print(g,'\t',yomi_dict.get(g))
    print()

単に文章だけを生成すると
読み方がわからないので
別途読み方用の辞書も用意して
生成された文章に当てています。

結果は


1
河上乃 	 かはかみの
伊都藻之花乃 	 いつものはなの
何時々々 	 いつもいつも
来座吾背子 	 きませわがせこ
時自異目八方 	 ときじけめやも

2
足桧木之 	 あしひきの
山菅根之 	 やますがのねの
懃 	 ねもころに
不止念者 	 やまずおもはば
於妹将相可聞 	 いもにあはむかも

3
暮月夜 	 ゆふづくよ
暁闇夜乃 	 あかときやみの
朝影尓 	 あさかげに
吾身者成奴 	 あがみはなりぬ
玉蜻 	 たまかぎる
髣髴所見而 	 ほのかにみえて
徃之兒故尓 	 いにしこゆゑに

4
待君常 	 きみまつと
庭耳居者 	 にはのみをれば
打靡 	 うちなびき
吾黒髪尓 	 わがくろかみに
霜乃置萬代日 	 しものおくまでに

5
國遠 	 くにとほみ
直不相 	 ただにはあはず
夢谷 	 いめにだに
相見与 	 あふとみえこそ
我戀國 	 あがこふらくに

6
現 	 うつつには
直不相 	 ただにはあはず
夢谷 	 いめにだに
吾尓所見社 	 われにみえこそ
相日左右二 	 あはむひまでに

7
天降就 	 あもりつく
神乃香山 	 かみのかぐやま
打靡 	 うちなびき
春去来者 	 はるさりくれば
小竹之末丹 	 しののうれに
尾羽打觸而 	 をはうちふれて
鴬鳴毛 	 うぐひすなくも

8
劔大刀 	 つるぎたち
名之惜毛 	 なのをしけくも
吾者無 	 われはなし
不相日數多 	 あはぬひまねく
年之經者 	 としのへぬれば

9
三吉野之 	 みよしのの
御金高尓 	 みかねがたけに
間無序 	 まなくぞ
雨者落云 	 あめはふるといふ
不時曽 	 ときじくぞ
雪者落云 	 ゆきはふるといふ
其雨 	 そのあめの
無間如 	 まなきがごと
隈毛不堕 	 くまもおちず
思乍叙来 	 おもひつつぞくる
其山道乎 	 そのやまみちを

10
於保伎美乃 	 おほきみの
美己等可思古美 	 みことかしこみ
可奈之伊毛我 	 かなしいもが
多麻久良波奈礼 	 たまくらはなれ
阿夜尓可奈之毛 	 あやにかなしも

11
吾妹兒尓 	 わぎもこに
相坂山之 	 あふさかやまの
皮為酢寸 	 はだすすき
穂庭開不出 	 ほにはさきでぬ
戀乎吾為 	 こひをぞあがする
玉蜻 	 たまかぎる
直一目耳 	 ただひとめのみ
視之人故尓 	 みしひとゆゑに


それっぽいのが
できていますかね?

万葉集読んだことないので
正しいかどうかはわかりません。

元の歌と被っているところも多いと思います。

なので
あんまり使えないプログラムではあります。

なぜこんなものを作ったかというと

古文イレブン

言いたかった!!!!

ただそれだけです。


新元号が決まりましたね

令和

元号当てに挑戦しましたが
こら当たらんわーーーー

なので元号に関することを
いろいろ調べてみました。


解説動画はこちら


あてまずは

今までの元号についてです

今までの元号は247個ありました。
元号開始年年数(だいたい)
大化6455
白雉65022
白鳳67214
朱鳥68615
大宝7013
慶雲7044
和銅7087
霊亀7152
養老7177
神亀7245
天平72920
天平勝宝7498
天平宝宇7578
天平神護7652
神護景雲7673
宝亀77011
天応7811
延暦78224
大同8064
弘仁81014
天長82410
承和83414
嘉祥8483
仁寿8513
斎衡8543
天安8572
貞観85918
元慶8778
仁和8854
寛平8899
昌泰8983
延喜90122
延長9238
承平9317
天慶9389
天暦94710
天徳9574
応和9613
康保9644
安和9682
天禄9703
天延9733
貞元9762
天元9785
永観9832
寛和9852
永延9872
永祚9891
正暦9905
長徳9954
長保9995
寛弘10048
長和10125
寛仁10174
治安10213
万寿10244
長元10289
長暦10373
長久10404
寛徳10442
永承10467
天喜10535
康平10587
治暦10654
延久10695
承保10743
承暦10774
永保10813
応徳10843
寛治10877
嘉保10942
永長10961
承徳10972
康和10995
長治11042
嘉承11062
天仁11082
天永11103
永久11135
元永11182
保安11204
天治11242
大治11265
天承11311
長承11323
保延11356
永治11411
康治11422
天養11441
久安11456
仁平11513
久寿11542
保元11563
平治11591
永暦11601
応保11612
長寛11632
永万11651
仁安11663
嘉応11692
承安11714
安元11752
治承11774
養和11811
寿永11822
元暦11841
文治11855
建久11909
正治11992
建仁12013
元久12042
建永12061
承元12074
建暦12112
建保12136
承久12193
貞応12222
元仁12241
嘉禄12252
安貞12272
寛喜12293
貞永12321
天福12331
文暦12341
嘉禎12353
暦仁12381
延応12391
仁治12403
寛元12434
宝治12472
建長12497
康元12561
正嘉12572
正元12591
文応12601
弘長12613
文永126411
建治12753
弘安127810
正応12885
永仁12936
正安12993
乾元13021
嘉元13033
徳治13062
延慶13083
応長13111
正和13125
文保13172
元応13192
元亨13213
正中13242
嘉暦13263
元徳13292
元弘13311
正慶13322
建武13342
延元13362
暦応13382
興国13402
康永13423
貞和13451
正平13464
観応13502
文和13524
延文13565
康安13611
貞治13626
応安13682
建徳13702
文中13723
永和13750
天授13754
康暦13792
永徳13810
弘和13813
至徳13840
元中13843
嘉慶13872
康応13891
明徳13904
応永139434
正長14281
永亨142912
嘉吉14413
文安14445
宝徳14493
亨徳14523
康正14552
長禄14573
寛正14606
文正14661
応仁14672
文明146918
長享14872
延徳14893
明応14929
文亀15013
永正150417
大永15217
享禄15284
天文153223
弘治15553
永禄155812
元亀15703
天正157319
文禄15924
慶長159619
元和16159
寛永162420
正保16444
慶安16484
承応16523
明暦16553
万治16583
寛文166112
延宝16738
天和16813
貞享16844
元禄168816
宝永17047
正徳17115
享保171620
元文17365
寛保17413
延享17444
寛延17483
宝暦175113
明和17648
安永17729
天明17818
寛政178912
享和18013
文化180414
文政181812
天保183014
弘化18444
嘉永18486
安政18546
万延18601
文久18613
元治18641
慶応18653
明治186844
大正191214
昭和192663
平成198930

大化から始まって
平成までですね。


このうち
よく長く続いた元号は
昭和 63
明治 44
応永 34
平成 30
延暦 24
天文 23
白雉 22
延喜 22
享保 20
天平 20
寛永 20

こんな感じでした。

よく使われる漢字だと
永 29
元 27
天 26
治 21
応 20
長 19
正 19
文 19
和 19
安 17
延 16

こんな感じです。

長く続いた元号(10年以上)に
含まれていた漢字に絞ると

成仁承禄化雉貞鳳正文
明政元永亀平治大和鳥
慶朱亨観延弘長保宝白
安応喜昭寛享天暦

の38個でした。

「令和」の「和」は
長く続いた元号の漢字でもあり
多く使われた漢字でもあったわけです。

ただし「令」は初めてなんじゃないでしょうか

ということで
常用漢字の中からの
組み合わせで考えると
どのくらいの組み合わせになるのかを
計算してみました。

常用漢字の個数は
2136個です。

これを2つ組み合わせるなら

2136 ** 2
4,562,496

ただしこれだと重複もあるので
和和とかもできてしまいます。

重複なしだと
# 重複なしの組み合わせ数
import itertools
k_len = len([k for k in itertools.permutations(kanji,2)]) print(k_len)
4,560,360

少しだけ減りますね

この確率がどのくらいかというと
宝くじを当てるがごとくです。

サマージャンボだと1000万分の1
ドリームジャンボだと500万分の1
です。

ロトシックスだと
# ロト6の確率(1-43までの数字を6個当てる)
lot = len([b for b in itertools.combinations([num for num in range(1,44)],6)])
print(lot)
6,095,646

いかがでしょうか?

今回の元号を3年前に当ててた人がいたようですが
宝くじを当てたような確率です。

なーーんかもったいない気がしますね。

世紀の元号当て
皆様は当たりましたでしょうか

それでは。

 

はいどうも乙pyです

今回は
プログラミング初学者が押さえておくべき

プログラム言語の流行として

Githubというサービスが昨年公開した
プルリクエストの
プログラム言語ランキングを
お送りしたいと思います。

ちなみにプルリクエストとは
Githubで開発している開発者が
プログラムを修正しましたぜ!!
っていうのを知らせることです。

このリスエスト数を追うことで
世の中のプログラム言語の流行が分かるというわけです。


動画はこちら



さて早速10位から4位までを発表です。

10位 : Ruby
09位 : C言語
08位 : Bash Shell
07位 : TypeScript
06位 : C#
05位 : C++
04位 : PHP

10-4位までを見てみると
C系は多く入っていますね。

やはりCはプログラムの基本的な言語という位置づけで
必ず10位には入ってきます。

ゲーム開発では
UnityがC#
UnrealEngineがC++なので
スマホアプリの開発には
欠かせ無いものになって来ています。

自分も転職のために
一時期Unityでクソゲー開発に邁進していた時期があり
C#をガリガリ書いていました。


RubyやPHPは
WEBサイトを作るのに
人気のある言語で日本でも多くの会社で
採用されています。

開発者であればLinuxなどのサーバーで
作業をすることも多いと思うので
Bash Shellも当然使っているはずなので
ランキングに入って来ています。


さてここからはトップ3です!!!



03位 : Python
プルリクランキング.009

Pythonは近年での人気が急上昇している言語です。

特に機会学習やAI開発では
この言語の学習者がほとんどで
学んでいないエンジニアがいないです。

他にもWEBサイトやブロックチェーンなどの
アプリケーションを作ることもできるので
初めて学ぶには最適な言語かなと思っています。

こちらで無料講座も開いておりますので
ご参考にしていただければと思います。

Python講座はこちら


02位 : Java
プルリクランキング.010

昔から人気があり
幅広いエンジニアが採用している言語の一つです。

C,Python,JavaはGoogle三大プログラム言語なので
ここを押さえておくのは必須だろうと思います。

近年ではAndroid開発で多く用いられているので
2位に食い込んでいるのかなと思いました。

そして
栄えある流行トップの言語は・・・


01位 : JavaScript
プルリクランキング.011


Javascriptが去年の人気1位だったようです。

ちなみに2位のJavaとは響きは似ていますが
似て非なる言語です。

インドとインドネシア位違う言語です。
なぜこんな名称にしてしまったのだろうか・・・


WEBサイトでは
必ずJavascriptが動きますし
インターネットの世界では外すことの出来ない言語ですね。

近年ではNode.jsなどでサーバー側でも動きますし
Reactなどのフレームワークを用いた開発も盛んで
フロントエンドの開発と言えば
Javascript一択です。

自分はサーバーサイドの言語がメインであるので
UI開発はそこまでやりませんが
簡単なコードを書いたりは出来ます。

3つ巴オセロのコードは
Javascriptで作りましたし

中堅のエンジニアであれば
大体の人は押さえているのでは無いかと
思います。


さて
これからプログラミングを学ぼうと思っている人は
どうやってプログラム言語を選べば良いのでしょうか?

まずは
目的を決めることですね。

何をやりたいかで
学ぶべき言語を決めるのが
良いのではないでしょうか。

あくまでも
プログラム言語は
目的を達成するための手段であって
ただの道具にしか過ぎません。

ですので迷うのであれば
言語は目的を持って決めれば良いのです。


ざっくりと
目的別でプログラム言語を分類してみると

ゲーム開発なら
UnityがC#
UnrealEngineがC++

WEBサイト(WEBアプリ)開発なら
Javascript , PHP , Java , Python

アンドロイド開発とビッグデータ周り
Java

AI , 機会学習なら
Python一択です。



特に目的がなく
なんとなくプログラミングを覚えたい方であれば
PythonかJavaをお勧めします。

Rubyはあまりお勧めしません。
言語別の求人を見ても
求人が少ないからです。


Javascriptは
あとあと必然的に覚えることになるかと
思うので最初に選ばなくても
いずれはやることになるかと思います。

自分はこの言語ランキングのうち
RubyとTypeScriptをのぞいた
8つの言語に触れたことがありますが

メインで使っているのは
現在はPythonです。

自分がプログラミングを始めた時は
Javaを学んでいました。

それでJavaならある程度なんでも
書ける所までやり、
その後Pythonに移行しました。

まずはメインで書ける言語があると
他の言語への移行はスムーズに進みます。

基礎が出来ていれば
他のプログラム言語の
学習コストが大幅に下がるため
まずは一つなんでもできる言語を
身に付けるのがいいかと思います。

一番驚いたのは
Pythonはコードを書く量が
圧倒的に少なくなるので
コードを追いやすく
初学者にはとても向いているのでは
ないかと思っています。

Javaと同じコードを書いても
10から3分の1程度のコード量で済むのと
学習コストが圧倒的に少なかったです。

求人で見るとPythonの求人は
玄人向けの求人が多いので
その点ではJavaに劣るかもしれませんが

どのみちエンジニアであれば
複数の言語は使えて当たり前かと思うので
今ある仕事を変えたい方は
その目的に合った言語を学ぶのがいいかと思います。


ということで
こういった言語の流行を押さえておくと
これからプログラミングを学びたい方の
プログラム言語の選択に一役買うのでは
無いかと思います。

参考になれば幸いです。

それでは

はい

先日TBSで放送されていた
「水曜日のダウンタウン」

こちらで放送されていた説
「三つ巴対決そこそこ盛り上がる説」


これに出てきてた
三つ巴オセロをJavascriptで再現してみました

解説動画はこちら



さて
ここではHTML , Javascript , CSSを用いて
オセロゲームを再現しています。

黒白赤のターン制でボードは8x8マス
自分の色以外の色であれば
ひっくり返すことができることとしました。


最初の配置は
番組内で用いられていた配置を採用しています。

スクリーンショット 2019-03-21 14.27.48

これは3つは並べておかないと
黒白のターンで赤が全て潰されてしまうからです。

初手で黒が赤白を挟みにゆくと

スクリーンショット 2019-03-21 14.28.29

こうなります。

黒を置いた時に
間のコマが赤か白であれば
ひっくり返せるようなアルゴリズムです。

続けて行くと
スクリーンショット 2019-03-21 14.28.39

こんな感じで埋まって行き

スクリーンショット 2019-03-21 14.28.53

最後はこうなりました。

どう端を取るか
どう取らせるか

3人対戦だと
ここら辺を考えるのが
だいぶ面白くなりますね

通常のオセロよりも
盛り上がるかもと思ってみたり。

もしかしたら
9x9マスとか増やしたほうが
良いのかもしれません。


パスをどうするとか
レギュレーションをどうするかとか
ルール決めが
三つ巴オセロゲームを面白くするための
重要項目になりますね。

4人対戦とか
長方形や星型、いびつな形でのボード
2人組みでチーム対戦できるとか
(黒白 , 青赤で相手チームの色をひっくり返せる)
Hexボードとか・・・


既存のゲームでも
少し改造してやることで
全く違ったゲームになり
遊びの幅が広がりますね。

もし何か
改造して欲しい、検証して欲しい
ゲームなどがあればTwitterやYotube他
コメントいただけると幸いです。

ソースコードも
希望があればお送りしたいと思いますので
コメントよろしくお願いいたします。

それでは!!





このページのトップヘ