u++の備忘録

ネイピア数への収束を可視化

ネイピア数(ネイピアすう、英: Napier's constant)は数学定数の一つであり、自然対数の底である。

ネイピア数 - Wikipedia

 このネイピア数{e}は、収束数列により以下のように定義される。

{ e=\displaystyle\lim_{n \to \infty}\left(1+\displaystyle\frac{1}{n}\right)^n
}

 この収束の様子を可視化してみた。

import matplotlib.pyplot as plt

def Napier(num):
    return (1 + 1 / num) ** num

n = 1
Napier_Number = []
for i in range(100):
    Napier_Number.append(Napier(n))
    n += 1
plt.plot(Napier_Number)
plt.show

 結果は以下。横軸は{n}、 縦軸は{\left(1+\displaystyle\frac{1}{n}\right)^n}{n} = 40辺りから収束が収斂しつつあると分かる。

f:id:upura:20161001224819p:plain

大相撲の巴戦は最初に戦う2人が有利

 9月場所で千秋楽前に豪栄道が優勝を決めました。純粋に嬉しいです。

 そういえば先場所の千秋楽、巴戦が発生しそうな状況でした。巴戦は一見平等に見えて、実力が同等の場合、実は最初に戦う2人が有利です。

mathtrain.jp

 確率的に計算すると、最初に戦う2人が優勝する確率が5/14、残った1人は4/14です。ただ少し直感的に分かりづらい部分もあり、今回は実際に巴戦を何回も実行するプログラムを書いて実験してみました。

# -*- coding: utf-8 -*-

import random
import collections

PLAYERS_NUM = 3
POWER = PLAYERS_NUM * [100]
result = [] # 結果集計用のリスト
REPEAT = 140000

# 対戦
def Battle(POWER_1, POWER_2):
    prob_win_1 = POWER_1 / (POWER_1 + POWER_2)
    prob_judge = random.random()   
    if prob_win_1 > prob_judge:
        return True
    else:
        return False

for i in range(REPEAT):
    check = True #終了判定用の変数
    # 初期設定
    win_count = 1
    player_1 = 0
    player_2 = 1
    last_winner = 2 #最初に戦わないplayer
    reserve_player = []    
    for j in range(2, PLAYERS_NUM):
        reserve_player.append(j)
    
    while check:
        if Battle(POWER[player_1], POWER[player_2]):
            winner = player_1
            loser = player_2
            player_2 = reserve_player[0]
        else:
            winner = player_2
            loser = player_1
            player_1 = reserve_player[0]
        reserve_player.pop(0)
        reserve_player.append(loser)
        #終了判定
        if last_winner == winner:
            win_count += 1            
            if win_count == PLAYERS_NUM - 1:
                check = False
        else:
            last_winner = winner
            win_count = 1
            
    result.append(winner)

count_dict = collections.Counter(result)
for i in range(PLAYERS_NUM):
    print(str(i) + "の勝率:" + str(count_dict[i] / REPEAT))

 実行結果は以下の通りです。乱数を使っているので、細かな値は変動します。

0の勝率:0.3558428571428571
1の勝率:0.3577571428571429
2の勝率:0.2864

 0と1が最初に戦う力士です。5/14 = 0.3571... , 4/14 = 0.2857... なので、確率的な計算結果とほぼ合致しています。

はてなブログにソースコード埋め込み

 公式ヘルプより引用。

help.hatenablog.com

 

はてな記法では、スーパーpre記法でプログラムのソースコードなどを表示する際に、シンタックスハイライト(Syntax highlighting、言語ごとの構文に応じた色付け表示)が利用できます。


 ということでお試し。以下のような記述をする。

f:id:upura:20170705165756p:plain

for i in range(1,101):
    if i % 15 == 0:
        print 'FizzBuzz'
    elif i % 5 == 0:
        print 'Buzz'
    elif i % 3 == 0:
        print 'Fizz'
    else:
        print i


 おお、できてる。最初の||の間に言語名を書くと、自動で色付けしてくれる。

 最初うまくいかず、ググっていたら下記記事に助けられた。記事単位で編集モードが変わるらしく、既に「見たまま」で編集中に設定を切り替えても「はてな記法」にならないとのこと。改めて記事を新規作成したら解決した。

www.weblog-life.net

このDNSサーバーは使用できない可能性があります

 標題の表示が出て無線LANに接続できなかったが、下記サイトを参考に解決した。

 OSはWindows10で、実施日は2016年9月23日。

chai-desu.hatenablog.com

===

追記20171211

昔に本当に雑な備忘録として書いた記事が常に弊ブログのアクセスランキングの上位に君臨しているので、よほどタイトルのエラーが世に頻発していると感じた。所感だが、筆者の場合は上記対応で解決したが、大概の場合はDNSサーバー以前の設定の問題でこのエラーが出ていると思う。「DNSサーバー」という語句に惑わされず、もっと根本のルーターの設定などに目を向けると解決に近づくかもしれない。