python蒙特卡洛模拟_基于Python的21点游戏蒙特卡洛模拟

问题重述:

大多数赌场使用6副牌或8副牌玩这种游戏,以防止“数牌点”,在你的模拟中使用两副牌(共104张)。只有2位参与者,你和庄家。游戏开始时每人得到两张牌,对于牌面为2~10的牌,点数和面数相同;对于为人脸(J、Q、K)的牌,点数为10;牌面为A的牌,点数为1或者11.游戏的目的是得到总数尽量接近21点的牌,不得超过(超过称“爆了”),并使你得到的总点数多于庄家。

如果开始两张牌的总点数恰为21(A-10或A-人脸),称为21点,自动成为胜者(若你和庄家都得到21点,则为平局,你的赌注仍在台上)。靠21点赢时,付给你3赔2,即1.5赔1(1元赌注赢1.5元,且1元赌注仍保留)。

如果你和庄家都未得到21点,你想要多少张牌就可以取多少张牌,一次一张,使总数尽量接近21点,如果你超过了21点,就输了,游戏结束。一旦你对牌的点数满意,你就“打住”,然后庄家按照下列规则取牌:

当庄家牌的点数为17、18、19、20和21时,就打住。若庄家牌的点数小于或等于16,必然取牌。庄家总把A的点数记为11,除非这样使他或她爆了(这时A的点数记为1)。例如,庄家的A-6组合是17点,不是7点(庄家没有选择权),且庄家必须打住在17点上。而若庄家有A-4组合(15点),又拿了一张K,那么新的总点数是15,因为A回到点数1(使之不超过21点) ,庄家还要再取牌。

如果庄家超过21点,你就赢了(赢赌注的钱,每1元赌注赢1元)。如果庄家的总点数超过你,你将输掉全部赌注。如果庄家和你的总点数相同,为平局(你不输也不赢)。

赌场中这个游戏的刺激之处在于,庄家开始的两张牌一张明、一张暗,所以你不知道庄家牌地总点数,必须根据那张明牌赌一把。在这个项目模拟中你不用考虑这种情况,你需要做的是:用两副牌做12次游戏,你有无限的赌资,每次下赌2元。两副牌玩过一次之后,用两副新牌继续玩,这时记录你的得分,然后下一幅牌从0开始,输出是12个结果,你可以用平均数决定你的总成绩。

函数说明与实现:

get_the_card( a )

输入一个列表,返回一个整数。

这个函数可以随机地从总扑克牌列表(列表名为:desktop)中获取一张扑克牌,并将其从扑克牌列表desktop中删除(因为同一张扑克牌不能取两次)。返回新获取到的扑克牌的值。

def get_the_card(a):

'''

从桌面上获取一张扑克牌,并将其从扑克牌列表中删除。

输入一个列表,返回随机获取的扑克牌值。

'''

n = len(a)

if n == 0:

sys.exit(1)

rand_num = np.random.randint(0, n) # 从现有的扑克牌中随机抽取一张

num = a.pop(rand_num) # 弹出选中的那一张

return num

count_points( a )

输入一个列表,返回一个列表。

这个函数输入玩家手中的扑克牌列表。(列表名为:player_cards 和 banker_cards),返回玩家手中牌所代表分值的所有可能(列表),不同的可能是由于A牌既可以看成是1也可以看成是11造成的。例如玩家手中的牌是 [1, 1, 1] 那么所有可能为 [3, 13, 23, 33]。

def count_points(a):

'''

这个函数用于计算玩家手中的牌点数的所有可能

输入:输入一个列表

输出:输出一个列表

'''

i = 0

sum_points = list([sum(a)])

while(1 in a):

a.remove(1)

i = i+1

sum_points = sum_points + [sum_points[-1] + 10]

for k in range(i):

a.append(1)

return sum_points

whats_the_point (cards, k)

输入一个列表,一个整数,返回一个整数。这个函数调用了上面的函数。

如果点数超过21点则返回-2,如果点数刚好是21,返回-1,如果点数介于[0, 19]之间则直接返回点数。

这个函数输入的是玩家手中扑克牌的列表和一个阈值,返回玩家手中牌在阈值的条件下,最具有优势的点数。正如上面函数说明中叙述的那样,相同的牌可能代表不同的点数,阈值代表了玩家主观的判断,例如:玩家认为17点已经很大了不需要再抽牌了,也就是阈值取17,那么如果他手中的牌为 [1, 7], 那么这个玩家就不会继续抽牌了,如果阈值取为 19 那么这个玩家就会认为 [1, 7] 代表了18 那么他就可以继续抽牌期望点数超过19。

下图为主函数的流程图:

主函数流程图

def whats_the_point (cards, k):

'''

这个函数可以输出**玩家**最有可能的点数

输入:points:点数可能列表

k: 阈值

输出:返回最有可能的分数(整数)

'''

points = count_points(cards)

if(points[-1]

return points[-1]

elif(points[-1]>21):

if len(points)==1:

return points[-1]

points.pop(-1)

return whats_the_point (points, k)

elif(points[-1]>=k and points[-1]<=21):

return points[-1]

black_jack_game(k)

主函数,输入一个整数,返回一个整数(包括 -3, 3, 2,-2, 0)

这个函数调用了前三个函数,根据输入的阈值,返回一次游戏所得点数。

def black_jack_game(k):

# 初始化全部扑克牌,保存在列表中

desktop = [10]*32

for i in [1,2,3,4,5,6,7,8,9]:

desktop = desktop + [i]*8

# 初始的两张牌

banker_cards = list([get_the_card(desktop),get_the_card(desktop)])

player_cards = list([get_the_card(desktop),get_the_card(desktop)])

# print('第一次发牌时玩家手中的牌是', player_cards) # 检查点

# print('第一次发牌时庄家手中的牌是', banker_cards) # 检查点

banker_points = whats_the_point(banker_cards,k)

player_points = whats_the_point(player_cards,k)

# print('第一次发牌时玩家手中的牌是', player_cards) # 检查点

# print('第一次发牌时庄家手中的牌是', banker_cards) # 检查点

# print('第一次发牌时玩家的点数是', player_points) # 检查点

# print('第一次发牌时庄家的点数是', banker_points) # 检查点

# 判断是否获胜

if (banker_points == 21):

return -3

if (player_points == 21):

return 3

if(banker_points == 21 or(player_points == 21)):

return points

# 如果没有获胜则继续抽牌直到点数达到了k值

while True:

banker_cards = banker_cards + list([get_the_card(desktop)])

if(whats_the_point(banker_cards,k)>=k):

break

while True:

player_cards = player_cards + list([get_the_card(desktop)])

# print(player_cards) # 检查点

if(whats_the_point(player_cards,k)>=k):

# print('此时玩家手中的牌是', player_cards) # 检查点

# print('此时玩家手中的点数是', banker_cards) # 检查点

# print('此时玩家手中的点数是', whats_the_point(player_cards,k)) # 检查点

# print('此时庄家手中的点数是', whats_the_point(banker_cards,k)) # 检查点

break

if whats_the_point(player_cards,k)>21:

return -2

if whats_the_point(banker_cards,k)>21:

return 2

if whats_the_point(player_cards,k)

return -2

elif whats_the_point(player_cards,k)>whats_the_point(banker_cards,k):

return 2

elif whats_the_point(player_cards,k)==whats_the_point(banker_cards,k):

return 0

运行结果:

下表即为程序运行 12 次的运行结果:

运行结果

为了查看不同阈值对结果的影响设计了下面的程序:

point_list = []

sumPoint = 0

for k in range(1,22):

for i in range(0,1000):

sumPoint = sumPoint + black_jack_game(k)

point_list = point_list + [sumPoint]

我们对0到22的阈值分别取了1000次实验结果,实验结果如下图所示,x轴为阈值,y轴为1000次模拟实验结果的总和。从结果中可以看出阈值越小,胜利的概率越大。

不同阈值下的结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php 接受 amp,php中amp;amp;和||的用法

这两个是php 中的关系运算符。php中的关系运算符有&#xff1a;&&(and)、||(or)、xor(亦或)、&#xff01;(非)、名称 关系 示例 结果and 与 $x and $y 如果 $x 和 $y 都为 true&#xff0c;则返回 true。or 或 $x or $y …

spring更新后 外层事务查不到_再深一点:面试工作两不误,源码级理解Spring事务...

原创&#xff1a;小姐姐味道(微信公众号ID&#xff1a;xjjdog)&#xff0c;欢迎分享&#xff0c;转载请保留出处。Spring有5种隔离级别&#xff0c;7种传播行为。这是面试常问的内容&#xff0c;也是代码中经常碰到的知识点。这些知识枯燥而且乏味&#xff0c;其中有些非常的绕…

php 字符串比较txt,PHP读到txt中文字符串比较失败

最近开始做PHP。今天从txt文件中读取一个中文字符串&#xff0c;跟一个字符串作比较&#xff0c;老是匹配失败&#xff0c;开始以为是编码问题&#xff0c;因为我的PHP文件编码是utf-8&#xff0c;遂将txt文件的编码也改成utf-8&#xff0c;好&#xff0c;噩梦来了...我将读到的…

箭头函数的this指向谁_高阶函数

NodeJS 系列文章&#xff0c;本篇是第一篇&#xff0c;首先&#xff0c;预计将后续高频使用逻辑串一遍&#xff0c;依次是高阶函数&#xff0c;promise以及事件机制。本篇主要是高阶函数。call、bind、applycall、apply 都是改变 this 指向&#xff0c;区别是接受参数的方式不一…

php怎么加编码,php怎么设置编码格式

php设置编码格式的方法&#xff1a;首先在php脚本中添加【header(“Content-Type: text/html; charsetutf-8")】&#xff1b;然后在静态页面设置编码&#xff1b;最后保证所有文件的编码相同即可。如果要使用gb2312编码&#xff0c;那么php要输出头&#xff1a;(推荐教程&…

java 中文 音序,java 中文字符串数组按照音序排列

java 中文字符串数组按照音序排列复制代码 代码如下:public class SortComparator implements Comparator{public int compare(Object o1,Object o2) {try{byte[] buf1 ((String) o1).getBytes("unicode");byte[] buf2 ((String) o2).getBytes("unicode"…

matlab1 3倍频程,瞬时声压时域数据怎么用matlab进行1/3倍频程声压级分析

%A计权声压级频谱分析clc;clear;close all;%时域分析ywavread(abc.wav);%频域分析fs51200;%采样频率p02e-5;%参考声压f[1.00 1.25 1.600 2.00 2.50 3.15 4.00 5.00 6.30 8.0]; %基准中心频率f1[20.00 25.0 31.5 40.0 50.0 63.0 80];fc[f1,100*f,1000*f,10000*f]; %%%%%%%%%中心…

python paramiko长连接_【Python】 SSH连接的paramiko

paramiko*paramiko需要PyCrypto模块的支持paramiko支持通过SSH协议进行一些操作&#xff0c;比如远程执行命令&#xff0c;上下传文件等等用法&#xff1a;①  远程命令ssh paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())#指定当对方主机没…

php 共享内存列队,php中对共享内存,消息队列的操作

消息队列中的数据同样受到大小的约束&#xff0c;具体约束范围可通过msg_stat_queue的msg_qbytes看到。这段代码唯一有点小改动的地方就在接受消息时&#xff0c;指定了MSG_IPC_NOWAIT&#xff0c;不然如果目标队列没有数据&#xff0c;默认会一直等待。 一般会用到共享内存或消…

python文件路径拼接多出斜杠_浅谈python中拼接路径os.path.join斜杠的问题

浅谈python中拼接路径os.path.join斜杠的问题调试程序的过程中&#xff0c;发现通过os.path.join拼接的路径出现了反斜杠directory1/opt/apps/upgradePackagedirectory2icp_v1.8.0directory3os.path.join(directory1,directory2)print(directory3 : %s %directory3)执行结果dir…

matlab约当消去法,Gauss消去法解线性方程组(Matlab)

clear;clc;% Gauss消去法解线性方程组A[3 -5 6 4 -2 -3 8;1 1 -9 15 1 -9 2;2 -1 7 5 -1 6 11;-1 1 3 2 7 -1 -2;4 3 1 -7 2 1 1;2 9 -8 11 -1 -4 -1;7 2 -1 2 7 -1 9];%系数矩阵b[11 2 29 9 5 8 25];%n维向量yinv(A)*b %matlab的计算结果nlength(b);%方程个数nxzeros(n,1);%…

动感灯箱制作流程培训_广告立体灯箱的特点有哪些?

随着广告业的发展&#xff0c;灯箱广告行业也在突飞猛进。在灯箱广告屏的设计与制作中&#xff0c;为了追求真实感和艺术性&#xff0c;采用彩印或摄影喷绘;也有人用特种纸、塑料板(膜)、灯箱布等进行丝网印刷制作灯箱图片&#xff0c;并根据成本和耐候性要求选择制作方法和灯箱…

MATLAB仿真TSC在哪里找,-bash:tsc:找不到命令

我正在使用MAC并尝试安装TypeScript . 我使用安装打字稿sudo npm install -g typescript以下是结果Password:/Users//node/bin/tsc -> /Users//node/lib/node_modules/typescript/bin/tsc/Users//node/bin/tsserver -> /Users//node/lib/node_modules/typescript/bin/tss…

supervisor 重启_supervisor_twiddler的使用

点击上方蓝字关注【 北邮郭大宝 】Supervisor可以很好的实现Python的进程管理&#xff0c;但是新增进程时需要配置文件&#xff0c;对于需要动态创建进程的场景不是很友好&#xff0c;supervisor_twiddler插件可以帮助实现上述功能。本文就supervisor_twiddler的使用做简单的de…

matlab的词云,Word Cloud (词云) - JavaScript

在上一篇中已经分享了用 Python 创建词云了。接下来继续总结其他创建词云的方法。&带道术用量确示常构端析以要效开的用&#xff0c;近不gt;> Create Word Cloud via JavaScrip要圈器是天的年编功小还久概据含直这请框结业未商屏页屏随会维气大机域页效实一应控高标tJav…

python数据分析的步骤排序_Python数据分析

一.数据分析步骤1.提出问题2.理解数据3.数据清洗4.构建模型5.数据可视化二.朝阳医院2018年销售数据数据导入在文件路径前加r(转义符)文件可能有多个sheet&#xff0c;所以用sheet_name重命名参数dtypestr同意先按照字符串读入&#xff0c;之后再转换salesDf.head()&#xff0c;…

archlinux php mysql,arch linux上安装 httpd+php+mysql+ openssl(转)

arch linux上安装 httpdphpmysql openssl(转)[more]在arch linux安装则是非常的容易&#xff0c;只要执行&#xff1a;# pacman -Sy apache php mysql openssl根据提示选择输入Y即可安装&#xff01;1.修改apache配置文件默认的情况&#xff0c;apache是不支持PHP的&#xff0c…

ai人工智能python开发_Python才是人工智能AI的首选编程语言,你值得拥有……

在所有编程语言里&#xff0c;Python并不算萌新&#xff0c;从1991年发布第一个版本&#xff0c;至今已经快30年了。最近几年&#xff0c;随着人工智能概念的火爆&#xff0c;Python迅速升温&#xff0c;成为众多AI从业者的首选语言。根据数据平台 Kaggle发布的2017年机器学习及…

php bind_param,php – 在mysqli bind_param中绑定动态变量

当我尝试下面的代码时,它会给我一个警告mysqli_stmt::bind_param(): Number of elements in type definition string doesnt match number of bind variables$stmt $mysqli->prepare(SELECT * FROM users WHERE lname ? AND fname ?);$type "ss";$param ar…

unique函数_unique函数使用场景(一)

unique函数使用场景(一)前情提示&#xff1a;Microsoft 365(就是原来的office 365)已经推出有一段时间了&#xff0c;去年年审就在项目上使用365更新的一系列动态函数来提高审计效率(大胆一点&#xff0c;就是更好的偷懒)。讲解动态函数的文章不多&#xff0c;且365普及度低&am…