编程的乐趣

/@峰哥何峰 /

峰哥虽然后来去学了个 MBA,但其实本科时候是学习数学的,并且也曾经会写程序。毕业之后,做起了 management consulting, 读了 MBA,编程技能就生疏了。

不过偶尔有机会,还是会写点代码。从中获得很大乐趣。比如上周【简单心理】工程师导出了一些数据,需要分析。但是工程师开发太忙,而需要做的分析又足够复杂到 Excel 不能胜任。于是乎峰哥自己手痒在周末写了些代码,搞的不亦乐乎。

周末的代码不便分享,不过还是可以分享以前写的另一个小程序。首先说明,我对自己的代码能力还是有自知之明。在很多略懂编程的朋友看来,下面的代码肯定是惨不忍睹。之所以还好意思拿出来分享,是因为我想支持一个写代码的文化。在现代社会,对电脑技术有个基本的了解,并且能够写一些简单的代码,简直就想算数、识字、英语一样重要。这是一个非常实用的技能,甚至像峰哥这样粗糙的水平,也能够派上用场。

并且,编程本身就是件非常快乐的事情!

有个很好的活动叫做 Rails Girls (http://railsgirlschina.org),是教女生学编程的活动。峰哥大爱 ruby 语言,但是水平不足以当教练,那就以自己的经历分享来支持!希望更多人(无论男生女生)会喜欢上编程:)

===

曾经有人给我出了这么一道数学题:今有A、B、C 三门大炮。三门大炮的命中率分别是:

A:1/2

B:1/3

C:1/6

三门大炮互相开炮,问最后幸存的那门炮是A、B、C,以及大家同归于尽的概率分别是几何?

这道数学题是为了演示一个有点违背常理的结果:A、B 各自的最佳战略是相互开炮,因为彼此都是对方最大的敌人。结果就是反而是 C 很有可能成为最后的幸存者。

这个概念并不复杂,可到底 C 幸存的概率是多少?比 A、B 如何?要能够量化的回答这个问题,还是需要比较繁琐的概率分析。但是可能的情况很多,分析起来不厌其烦。有一个简单的方法:通过很多次模拟和统计,求得概率的近似值。这也就是通常所说的 monte carlo method。

作为一个 math 和 CS geek,我忍不住写了一个简单的 python 程序。因为好久没有写程序了,以前也没有用过 python,所以程序写的想必是非常糟糕,但是结果是正确的。从中得到莫大乐趣。以下是模拟 30w 次后的结果。可以看出 C 幸存的概率远远高于 A、B。

这是 python 程序:

import random

class Cannon(object):

def __init__(self, name, accuracy):

self.name = name

self.accuracy = accuracy

self.alive = True

self.target = None

def setTarget(self, target):

self.target = target

def hit(self):

result = random.uniform(0, 1)

if result < self.accuracy:

#print "hit!"

self.target.alive = False

return True

else:

#print "miss!"

return False

def __str__(self):

return 'This cannon is named ' + self.name + ", accuracy " + str(self.accuracy)

def testCannon():

myCannon = Cannon('A', 0.5)

target = Cannon('target', 0)

hitcount, misscount = 0, 0

for i in range(0,500):

myCannon.setTarget(target)

if myCannon.hit() == 1:

hitcount = hitcount + 1

else:

misscount = misscount + 1

print "hit " + str(hitcount) + "  miss " + str(misscount)

class Game(object):

def __init__(self):

self.cannons = []

def addCannon(self, newCannon):

if newCannon in self.cannons:

raise ValueError('Duplicate cannon')

else:

self.cannons.append(newCannon)

def removeCannon(self, cannon):

if cannon in self.cannons:

self.cannons.remove(cannon)

else:

raise ValueError('Cannon not found')

def bestPlayer(self):

if len(self.cannons) == 0:

return None

bestcannon = self.cannons[0]

for cannon in self.cannons:

if bestcannon.accuracy > cannon:

bestcannon = cannon

return bestcannon

def secondBest(self):

if len(self.cannons) < 2:

return None

bestcannon = self.bestPlayer()

secondBest = self.cannons[0]

if secondBest == bestcannon:

secondBest = self.cannons[1]

for cannon in self.cannons:

if (secondBest.accuracy < cannon.accuracy) and (bestcannon != cannon):

secondBest = cannon

return secondBest

def endGame(self):

#print "there are " + str(len(self.cannons)) + "cannons right now."

if len(self.cannons) <= 1:

return True

else:

return False

def winner(self):

if not self.endGame():

return

if len(self.cannons) == 0:

#print "no winner!!!"

return None

else:

return self.cannons[0]

def printCannons(self):

for cannon in self.cannons:

print cannon

def setTargets(self):

best = self.bestPlayer()

secondBest = self.secondBest()

for cannon in self.cannons:

cannon.setTarget(best)

best.setTarget(secondBest)

#for cannon in self.cannons:

#  print str(cannon) + ' target is ' + str(cannon.target)

def fire(self):

if self.endGame():

print "Game ended."

return None

self.setTargets()

for cannon in self.cannons:

cannon.hit()

for i in range(len(self.cannons)-1, -1, -1):

#print i

if not self.cannons[i].alive:

#print "hahaha this one dead " + str(cannon)

del self.cannons[i]

#self.printCannons()

def play(self):

while not self.endGame():

self.fire()

#winner = self.winner()

def testGame():

game = Game()

cannonA = Cannon('A', 1.0/2)

cannonB = Cannon('B', 1.0/3)

cannonC = Cannon('C', 1.0/6)

game.addCannon(cannonA)

game.addCannon(cannonB)

game.addCannon(cannonC)

game.printCannons()

game.endGame()

print "best " + str(game.bestPlayer())

print "2nd best " + str(game.secondBest())

print

#game.removeCannon(cannonA)

#print game.bestPlayer()

game.play()

def gameRuns():

totalRuns = 300000

aCount, bCount, cCount, nowinner = 0, 0, 0, 0

for i in range(totalRuns):

game = Game()

cannonA = Cannon('A', 1.0/2)

cannonB = Cannon('B', 1.0/3)

cannonC = Cannon('C', 1.0/6)

game.addCannon(cannonA)

game.addCannon(cannonB)

game.addCannon(cannonC)

game.play()

winner = game.winner()

if winner == cannonA:

aCount = aCount + 1

elif winner == cannonB:

bCount = bCount + 1

elif winner == cannonC:

cCount = cCount + 1

else:

nowinner = nowinner + 1

print "game " + str(i),

if winner is None:

print ": No winner"

else:

print ": winner is " + str(winner.name)

print

print "total simulation runs: " + str(totalRuns)

print "A wins " + str(aCount*1.0/totalRuns)

print "B wins " + str(bCount*1.0/totalRuns)

print "C wins " + str(cCount*1.0/totalRuns)

print "no winner " + str(nowinner*1.0/totalRuns)

#print "total: " + str(aCount + bCount + cCount + nowinner) + " " +  str(totalRuns)

gameRuns()

======

简单心理

加入我们!戳 =>http://www.jiandanxinli.com/pages/37

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容