ThinkStats (13)

昨日のソレ、出る直前に 30min くらいででっち上げた微妙な成果だったんですが、見直してみたいと思います。
つうかこれで良いのかな。

def Percentile(scores, percentile_rank):
    n = 0
    for i in scores:
        minValue = i
        minIndex = n
        nextN = n + 1
        for j in scores[n + 1:]:
            if j < minValue:
                minIndex = nextN
                minValue = j
            nextN += 1
        tmp = scores[n]
        scores[n] = scores[minIndex]
        scores[minIndex] = tmp
	if 100.0 * (n + 1) / len(scores) >= percentile_rank:
            return i
        n += 1

これでさらに不要なループが、なんですが汚いな。とりあえずここまで修正。

def swap(list, x, y):
    tmp = list[x]
    list[x] = list[y]
    list[y] = tmp

def Percentile(scores, percentile_rank):
    n = 0

    for i in scores:
        minValue = i
        minIndex = n
        nextN = n + 1

        for j in scores[n + 1:]:
            if j < minValue:
                minIndex = nextN
                minValue = j
            nextN += 1

        swap(scores, n, minIndex)

	if 100.0 * (n + 1) / len(scores) >= percentile_rank:
            return i

        n += 1

def main():
    print Percentile([55, 57, 66, 77, 88], 60)


if __name__ == '__main__':
    main()

乱数云々な部分も面白いので元気ならヤッてみるかも。

演習問題 3-9

ええと

Cdf と整数 n を受け取り、その Cdf からランダムに選ばれた n 個の値を返す Sample という関数を書いて下さい。

Think Stats より引用
とのこと。Cdf.py なソレを書き換えてみるとこんなカンジになるのかな。

def Sample(Cdf, n):
    return [Cdf.Random() for i in range(n)]

range という手続きはすばらですね。

明日は

ワープロ打ちが中心になるので気分転換にこちら対応の方向です。。