たくさん寝太郎の寝床

料理とITと皿回しが好きなオタクのブログ

エーレンフェストの壺の話

こんにちは、たくさん寝太郎です。

約一ヶ月ぶりのブログ投稿になりました...時の流れの速さを感じます


今日の講義で「エーレンフェストの壺のシミュレーションを行いなさい」というのがあったのでPythonでやってみました。

エーレンフェストの壺

  • 1からNの番号を付けたN個のボールを2つの壺に分ける
  • 1からNまでの番号をランダムに選び、その番号のボールを反対の壺に移動する

例えば左の壺に初めn個のボールが入っていたとして、この試行を繰り返していくとボールの個数はどのように変化するでしょうか?


今回はN=1000として10000回試行を繰り返してみます。

import matplotlib.pyplot as plt
import random

N = 1000
n = [200,500,800]

ball_list = [i+1 for i in range(N)]
random.shuffle(ball_list)
count = 0

for n_0 in n:
    left_box = ball_list[0:n_0]
    lb_num_balls = [n_0]
    for i in range(10000):
        r = random.randint(1,N)
        if r in left_box:
            left_box.remove(r)
            lb_num_balls.append(len(left_box))
        else:
            left_box.append(r)
            lb_num_balls.append(len(left_box))
        
    count += 1
    plt.subplots_adjust(wspace=0.8)
    plt.subplot(1,3,count)
    plt.plot(lb_num_balls)
    plt.title('n={}'.format(n_0))
    plt.xlim(0,10000)
    plt.ylim(0,N)
    
plt.show()

1から1000をシャッフルしたリストを作って、n=[200,500,800]でスライスします。
あとはランダムに選んだ番号がスライスしたリストに入っていればremoveしてリストの長さを-1、入っていなければappendしてリストの長さを+1すれば良いです。

これを実行すると次のグラフが出てきます。

f:id:kaworu_mk6:20190524231449p:plain

どれもN/2(=500)に向かってますね。

講義ではマスター方程式を使ってこのN/2を導出したりしたのですが面倒なので今日はここで終わろうと思います。




雑談

来週論文紹介で辛いです
あと3週間で水瀬いのりさんの3rdライブなのでがんばりぼん〜〜〜