本文实例讲述了Python计算斗牛游戏概率算法。分享给大家供大家参考,具体如下:
过年回家,都会约上亲朋好友聚聚会,会上经常会打麻将,斗地主,斗牛。在这些游戏中,斗牛是最受欢迎的,因为可以很多人一起玩,而且没有技术含量,都是看运气(专业术语是概率)。
斗牛的玩法是:
1. 把牌中的JQK都拿出来
2. 每个人发5张牌
3. 如果5张牌中任意三张加在一起是10的 倍数,就是有牛。剩下两张牌的和的10的余数就是牛数。
牌的大小:
4条 > 3条 > 牛十 > 牛九 > …… > 牛一 >没有牛
而这些牌出现的概率是有多少呢?
由于只有四十张牌,所以采用了既简单,又有效率的方法枚举来计算。
计算的结果:
1
2
3
4
5
6
7
|
所有牌的组合数:
658008
出现四条的组合数:
360
,概率 :
0.05
%
出现三条的组合数:
25200
,概率 :
3.83
%
出现牛十的组合数:
42432
,概率 :
6.45
%
出现牛九或牛八的组合数:
87296
,概率 :
13.27
%
出现牛一到牛七的组合数:
306112
,概率 :
46.52
%
出现没有牛的组合数:
196608
,概率 :
29.88
%
|
所以有七成的概率是有牛或以上的,所以如果你经常遇到没有牛,说明你的运气非常差或者本来是有牛的,但是你没有找出来。
Python源代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
# encoding=utf-8
import
os
import
cPickle
from
copy
import
copy
from
collections
import
Counter
import
itertools
'''
计算斗牛游戏的概率
'''
class
Poker():
'''
一张牌
'''
def
__init__(
self
, num,
type
):
self
.num
=
num
# 牌数
self
.
type
=
type
# 花色
class
GamePoker():
'''
一手牌,即5张Poker
'''
COMMON_NIU
=
1
# 普通的牛,即牛一-牛七
NO_NIU
=
0
# 没有牛
EIGHT_NINE_NIU
=
2
# 牛九或牛八
TEN_NIU
=
3
# 牛十
THREE_SAME
=
4
# 三条
FOUR_SAME
=
5
# 四条
def
__init__(
self
, pokers):
assert
len
(pokers)
=
=
5
self
.pokers
=
pokers
self
.num_pokers
=
[p.num
for
p
in
self
.pokers]
# self.weight = None # 牌的权重,权重大的牌胜
# self.money_weight = None # 如果该牌赢,赢钱的权重
self
.result
=
self
.sumary()
def
is_niu(
self
):
'''
是否有牛
:return:
'''
# if self.is_three_same():
# return 0
for
three
in
itertools.combinations(
self
.num_pokers,
3
):
if
sum
(three)
%
10
=
=
0
:
left
=
copy(
self
.num_pokers)
for
item
in
three:
left.remove(item)
point
=
sum
(left)
%
10
return
10
if
point
=
=
0
else
point
return
0
def
is_three_same(
self
):
'''
是否3条
:return:
'''
# if self.is_four_same():
# return 0
count
=
Counter([p.num
for
p
in
self
.pokers])
for
num
in
count:
if
count[num]
=
=
3
:
return
num
return
0
def
is_four_same(
self
):
'''
是否4条
:return:
'''
count
=
Counter([p.num
for
p
in
self
.pokers])
for
num
in
count:
if
count[num]
=
=
4
:
return
num
return
0
def
sumary(
self
):
'''
计算牌
'''
if
self
.is_four_same():
return
GamePoker.FOUR_SAME
if
self
.is_three_same():
return
GamePoker.THREE_SAME
niu_point
=
self
.is_niu()
if
niu_point
in
(
8
,
9
):
return
GamePoker.EIGHT_NINE_NIU
elif
niu_point
=
=
10
:
return
GamePoker.TEN_NIU
elif
niu_point >
0
:
return
GamePoker.COMMON_NIU
else
:
return
GamePoker.NO_NIU
def
get_all_pokers():
'''
生成所有的Poker,共四十个
:return:
'''
pokers
=
[]
for
i
in
range
(
1
,
11
):
for
j
in
(
'A'
,
'B'
,
'C'
,
'D'
):
pokers.append(Poker(i, j))
return
pokers
def
get_all_game_poker(is_new
=
0
):
'''
生成所有game_poker
:param pokers:
:return:
'''
pokers
=
get_all_pokers()
game_pokers
=
[]
if
not
is_new
and
os.path.exists(
'game_pokers'
):
with
open
(
'game_pokers'
,
'r'
) as f:
return
cPickle.loads(f.read())
for
pokers
in
itertools.combinations(pokers,
5
):
# 5代表五张牌
game_pokers.append(GamePoker(pokers))
with
open
(
'game_pokers'
,
'w'
) as f:
f.write(cPickle.dumps(game_pokers))
return
game_pokers
def
print_rate(game_pokers):
total_num
=
float
(
len
(game_pokers))
four_num
=
len
([game_poker
for
game_poker
in
game_pokers
if
game_poker.result
=
=
GamePoker.FOUR_SAME])
three_num
=
len
([game_poker
for
game_poker
in
game_pokers
if
game_poker.result
=
=
GamePoker.THREE_SAME])
ten_num
=
len
([game_poker
for
game_poker
in
game_pokers
if
game_poker.result
=
=
GamePoker.TEN_NIU])
eight_nine_num
=
len
([game_poker
for
game_poker
in
game_pokers
if
game_poker.result
=
=
GamePoker.EIGHT_NINE_NIU])
common_num
=
len
([game_poker
for
game_poker
in
game_pokers
if
game_poker.result
=
=
GamePoker.COMMON_NIU])
no_num
=
len
([game_poker
for
game_poker
in
game_pokers
if
game_poker.result
=
=
GamePoker.NO_NIU])
print
'所有牌的组合数:%d'
%
total_num
print
'出现四条的组合数:%d,概率 :%.2f%%'
%
(four_num, four_num
*
100
/
total_num)
print
'出现三条的组合数:%d,概率 :%.2f%%'
%
(three_num, three_num
*
100
/
total_num)
print
'出现牛十的组合数:%d,概率 :%.2f%%'
%
(ten_num, ten_num
*
100
/
total_num)
print
'出现牛九或牛八的组合数:%d,概率 :%.2f%%'
%
(eight_nine_num, eight_nine_num
*
100
/
total_num)
print
'出现牛一到牛七的组合数:%d,概率 :%.2f%%'
%
(common_num, common_num
*
100
/
total_num)
print
'出现没有牛的组合数:%d,概率 :%.2f%%'
%
(no_num, no_num
*
100
/
total_num)
def
main():
game_pokers
=
get_all_game_poker()
# 658008种
print_rate(game_pokers)
main()
|
如果有错误,欢迎指正。
更多关于Python相关内容可查看本站专题:《Python游戏开发技巧总结》、《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。