比这篇新的文章:
超级快的计算PI的方法,用javascript计算1000位也在瞬间完成
比这篇旧的文章: 封装Django的send_mail函数,方便在本地(没有邮件服务器)进行邮件相关的测试
作者: spellscroll, 点击697次, 评论(0), 收藏者(0), , 打分:
所有评论,共0条:( 我也来说两句)
比这篇旧的文章: 封装Django的send_mail函数,方便在本地(没有邮件服务器)进行邮件相关的测试
连庄 vs. 轮庄
语言: Python, 标签: simulation probability 2008/10/22发布 1年前更新 更新记录作者: spellscroll, 点击697次, 评论(0), 收藏者(0), , 打分:
Python语言: 连庄 vs. 轮庄
01 #!/usr/bin/env python
02 #coding=utf-8
03 """
04 http://spellscroll.com/questionfull/241/
05 两个赌徒A和B决定用如下规则开始赌博:
06 (1) 初始二人均为0分, 每局胜者得1分,先积满n=12分者为最后胜者.
07 (2) 另外每局需要挑选一人当庄, A当庄胜率为p=0.7, B当庄胜率为q=0.6.
08 有两种选庄规则, 一种是轮流当庄, 另一种是胜者连庄.
09 现在假设第一局由A当庄, 请问那种选庄规则对A更有利?
10 http://spellscroll.com
11 数学题概率题算法题编程题智力题
12 """
13
14 from scipy.misc import comb
15 import random
16
17 n = 12
18 p,q = prob = [.7,.6]
19
20 def compute_prob(n,p,q):
21 """ The formula to evaluate the final win probability
22 n n-1
23 --------------
24 k p 1-q
25 --------------
26 2n-1-k 1-p q
27 --------------
28 """
29 return sum([comb(n,x)*comb(n-1,k-x)*(p**x)*((1-p)**(n-x))*((1-q)**(k-x))*(q**(n-1-k+x)) for k in range(n,2*n) for x in range(k+1-n,n+1)])
30
31 def random_winner(server):
32 return (1- server) if random.random() > prob[server] else server
33
34 def play(option):
35 pts = [0,0]
36 server = 0
37 cnt = 0
38 while max(pts)<n: #sum(pts)<2*n-1:
39 winner = random_winner(server)
40 pts[winner] += 1
41 cnt += 1
42 if option == 'as': # 'as': alternate serving
43 server = 1 - server
44 elif option == 'ws': # 'ws': winner serving
45 server = winner
46 # print '# of games:',cnt
47 # print 'final winner:', winner
48 return winner, cnt
49
50 def simulation(k):
51 option = ['as','ws'] # alternate serving vs. winner serving
52 prob = [1 - sum([play(o)[0] for i in range(k)])/(k*1.0) for o in option]
53 duration = [sum([play(o)[1] for i in range(k)])/(k*1.0) for o in option]
54 # the simulated prob should be close to the result of comp_prob(n,p,q)
55 return prob, duration
02 #coding=utf-8
03 """
04 http://spellscroll.com/questionfull/241/
05 两个赌徒A和B决定用如下规则开始赌博:
06 (1) 初始二人均为0分, 每局胜者得1分,先积满n=12分者为最后胜者.
07 (2) 另外每局需要挑选一人当庄, A当庄胜率为p=0.7, B当庄胜率为q=0.6.
08 有两种选庄规则, 一种是轮流当庄, 另一种是胜者连庄.
09 现在假设第一局由A当庄, 请问那种选庄规则对A更有利?
10 http://spellscroll.com
11 数学题概率题算法题编程题智力题
12 """
13
14 from scipy.misc import comb
15 import random
16
17 n = 12
18 p,q = prob = [.7,.6]
19
20 def compute_prob(n,p,q):
21 """ The formula to evaluate the final win probability
22 n n-1
23 --------------
24 k p 1-q
25 --------------
26 2n-1-k 1-p q
27 --------------
28 """
29 return sum([comb(n,x)*comb(n-1,k-x)*(p**x)*((1-p)**(n-x))*((1-q)**(k-x))*(q**(n-1-k+x)) for k in range(n,2*n) for x in range(k+1-n,n+1)])
30
31 def random_winner(server):
32 return (1- server) if random.random() > prob[server] else server
33
34 def play(option):
35 pts = [0,0]
36 server = 0
37 cnt = 0
38 while max(pts)<n: #sum(pts)<2*n-1:
39 winner = random_winner(server)
40 pts[winner] += 1
41 cnt += 1
42 if option == 'as': # 'as': alternate serving
43 server = 1 - server
44 elif option == 'ws': # 'ws': winner serving
45 server = winner
46 # print '# of games:',cnt
47 # print 'final winner:', winner
48 return winner, cnt
49
50 def simulation(k):
51 option = ['as','ws'] # alternate serving vs. winner serving
52 prob = [1 - sum([play(o)[0] for i in range(k)])/(k*1.0) for o in option]
53 duration = [sum([play(o)[1] for i in range(k)])/(k*1.0) for o in option]
54 # the simulated prob should be close to the result of comp_prob(n,p,q)
55 return prob, duration
所有评论,共0条:( 我也来说两句)
代码
