In [2]:
from IPython.html.widgets import *
from IPython.display import HTML, display
import cgi
def show(*s):
    display(HTML('<div style="font-size: large">'+" ".join(cgi.escape(str(x)) for x in s)+'</div>'))

小女孩撿石頭的故事

東華應數 魏澤人

據說美國的林肯總統,曾經到郊外散步,遇到一個女孩,他想考驗這個女孩

就跟她說「小朋友,這一段路上有很多石頭,妳從這兒走到那頭,撿一個最大的石頭來給我,撿回來的石頭愈大,禮物就愈大,如果石頭很小,就只能給妳小禮物了,

But

有個規定,千萬不可以回頭來撿哦!」

接著,女孩便興奮地出發,走呀走的,女孩看到一粒很大的石頭,正要去撿,可是心想:說不定前面有更大的,於是她又往前走,總算看到一粒更大的石頭,她高興地衝過去把它撿起來,走了幾步,念頭一轉,「後面一定還有更大的」,所以又把石頭丟掉,結果,走著走著,她發現路快走完了,石頭卻愈來愈小,心裡既懊悔又不甘心,一猶豫便走到了盡頭,迎接她的,是一臉笑意的林肯,什麼禮物也沒有…。

這故事在講的是「貪」 但很多人把它解釋在愛情上

小女孩走的這一段路不就好像是我們的人生嗎?

人生錯過了就再也不能回頭

有一百顆石頭

如何讓找到最大顆的機率最大?

如何讓平均值最大?

對戰勝率最高?

In [3]:
from random import random, randint, shuffle
L = 100
def generate_stones():
    stones = list(range(L))
    shuffle(stones)
    information = [sum(stones[j]>stones[i] for j in range(i)) for i in range(L)]
    return stones, information
In [4]:
def 隨緣(information):
    i = randint(0,L-1)
    return i

def 專情(information):
    return 0
funcs = [隨緣, 專情]
In [5]:
N = 3000
def test1(funcs):
    show("test1: 選中最大")
    progress = IntProgressWidget(value=0,min=0,max=N)
    display(progress)
    bars = {f:IntProgressWidget(value=0, min=0, max=N) for f in funcs}
    for ip in bars.values():
        display(ip)
    for i in range(N):
        progress.description = "%10d\n"%(i+1)
        progress.value = i+1
        stones, info = generate_stones()
        for f in funcs:
            if stones[f(info)]== L-1:
                bars[f].value += 1
                bars[f].description = "%10s %6d"%(f.__name__, bars[f].value)

def test2(funcs):
    show("test2: 平均")
    progress = IntProgressWidget(value=0,min=0,max=N)
    display(progress)
    bars = {f:FloatProgressWidget(value=0, min=0, max=L) for f in funcs}
    for ip in bars.values():
        display(ip)
    sums = {f:0 for f in funcs}
    for i in range(N):
        progress.description = "%10d\n"%(i+1)
        progress.value = i+1
        stones, info = generate_stones()
        for f in funcs:
            sums[f] += stones[f(info)]
            bars[f].value = sums[f]/(i+1)
            bars[f].description = "%10s %6.3f"%(f.__name__, bars[f].value)
    
        
def test3(f1, f2):
    show("test3: 對戰")
    progress = IntProgressWidget(value=0,min=0,max=N)
    display(progress)
    score = [IntProgressWidget(value=0,min=0,max=N) for i in range(2)]
    display(score[0])
    display(score[1])
    for i in range(N):
        progress.description = "%10d\n"%(i+1)
        progress.value = i+1
        stones, info = generate_stones()
        v1 = stones[f1(info)]
        v2 = stones[f2(info)]
        if v1>v2:
            score[0].value +=1
            score[0].description = "%10s %6d"%(f1.__name__, score[0].value)
        elif v2>v1:
            score[1].value +=1
            score[1].description = "%10s %6d"%(f2.__name__, score[1].value)
In [67]:
N=3000
In [68]:
test1(funcs)
test1: 選中最大
In [41]:
test2(funcs)
test2: 平均
In [71]:
test3(問號39, 問號38)
test3: 對戰
In [63]:
funcs = [ 問號36, 問號37,  問號38, 問號35]
In [34]:
def 問號10(info):
    for i in range(10,L):
        if info[i] == 0:
            return i
    return L-1
In [18]:
def 最大石頭演算法(info):
    for i in range(50,L):
        if info[i] <= i/2:
            return i
    return L-1
In [26]:
def 問號15(info):
    for i in range(15,L):
        if info[i] == 0:
            return i
    return L-1
In [37]:
def 問號25(info):
    for i in range(25,L):
        if info[i] == 0:
            return i
    return L-1
In [36]:
def 問號50(info):
    for i in range(50,L):
        if info[i] == 0:
            return i
    return L-1
In [45]:
def 問號30(info):
    for i in range(30,L):
        if info[i] == 0:
            return i
    return L-1

def 問號35(info):
    for i in range(35,L):
        if info[i] == 0:
            return i
    return L-1
In [62]:
def 問號37(info):
    for i in range(37,L):
        if info[i] == 0:
            return i
    return L-1
In [59]:
def 問號36(info):
    for i in range(36,L):
        if info[i] == 0:
            return i
    return L-1
def 問號38(info):
    for i in range(38,L):
        if info[i] == 0:
            return i
    return L-1
In [70]:
def 問號39(info):
    for i in range(39,L):
        if info[i] == 0:
            return i
    return L-1
In [ ]: