R语者小case之——R语言模拟双骰儿游戏

双骰儿是一种常见的概率游戏,玩家同时投掷两个骰子,正面数字之和满足某种给定的条件即赢或者输。

假设规则是掷出2或者11,赢得投入的两倍;掷出3,5或者12,投入就成肉包子打狗;其他数字不输不赢。

在一次性游戏中玩家输赢的概率分别是多少,这如何通过R来计算呢?

这就带你体验当Rain Man的感觉!


image.png
library(tidyverse)#需要载入这两个包,没有的话请先安装
library(data.table)

#首先,我们学习一个函数sample,进行随机抽样,比如从1到6六个数字中间随机抽出一个数字,
#也就是投掷一个骰子的结果
sample(1:6,1)

[1] 2

#一次投掷两个骰子的结果则为两次随机抽样的和
sample(1:6,1)+sample(1:6,1)

[1] 7

#因为是随机抽样,每次出现的结果不尽相通,如果要重现固定的结果,需要使用种子设定函数set.seed
set.seed(100)
sample(1:6,1)+sample(1:6,1)

[1] 8

set.seed(100)
sample(1:6,1)+sample(1:6,1)

[1] 8

set.seed(123)
sample(1:6,1)+sample(1:6,1)

[1] 9

#种子函数变,则结果才发生变化

#接下来,我们需要将投掷两个骰子的行为重复多次比如100次,得到多次投掷的结果,这需要使用replicate函数
set.seed(123)
replicate(100,sample(1:6,1)+sample(1:6,1))

[1] 9 5 8 8 10 7 5 8 4 5 6 5 3 9 10 4 9 7 2 5 9 8 7 7 9

[26] 7 2 4 11 3 8 12 9 7 8 3 9 11 4 10 7 4 10 7 9 11 9 7 8 4

[51] 6 4 10 10 7 12 9 9 4 7 12 5 11 8 8 10 8 7 3 7 7 5 12 5 9

[76] 7 9 8 7 5 7 7 10 5 11 7 6 9 11 10 3 3 10 3 9 8 5 2 10 5

#如果我们要计算每种结果出现的概率,则需要重复尽可能多次数,这里我们设定为9999次
#因为结果太多,我们不需要全部显示,我们将之赋给一个对象名carps
set.seed(123)
craps<-replicate(9999,sample(1:6,1)+sample(1:6,1))
#每种结果出现的频率与概率
table(craps)

craps

2 3 4 5 6 7 8 9 10 11 12

272 599 820 1158 1405 1595 1392 1095 834 562 267

#每种结果出现的概率,可见两边的数字出现概率滴而中间数字的概率高,
#庄家的规则就在这种看似常识的东东上下功夫
prop.table(table(craps))

craps

2 3 4 5 6 7 8

0.02720272 0.05990599 0.08200820 0.11581158 0.14051405 0.15951595 0.13921392

9 10 11 12

0.10951095 0.08340834 0.05620562 0.02670267

barplot(prop.table(table(craps)))
image
#掷出2或者11即赢钱的概率,取等于2或者11的结果概率之和
0.02720272+0.05620562

[1] 0.08340834

#或者通过条件筛选carps里面的结果计算,length为符合条件的数量,|为运算符表示“或者”
length(craps[craps==2|craps==11])/9999

[1] 0.08340834

#同理可得掷出3,5或者12即输钱的概率
0.05990599+0.11581158+0.02670267

[1] 0.2024202

length(craps[craps==3|craps==5|craps==12])/9999

[1] 0.2024202

#至此输赢给概率就一清二楚了,最后,我们从理论上检验一下这些概率
#同时投掷两个骰子在理论上有6*6种组合方式,1到6任意两个数字相加(位置可颠倒)和1到6每个重复相加,每种出现的概率相等
#结果为2只有1+1一种组合,结果为11则有5+6两种组合,所以赢钱的概率为
3/36

[1] 0.08333333

#结果为3有1+2两种组合,结果为5有2+3,1+4四种组合,结果为12只有6+6一种组合,所以输钱的概率为
7/36

[1] 0.1944444

随机模拟的结果与之大体相近,小幅偏差来自模拟次数的限制,次数越多自然越接近理论值
既然理论值可以推算出来,那么问题来了,这种模拟到底有什么意义?
对于简单的概率游戏,组合方式极为有限,我们不难推算出理论上的概率
设想如果我们要投掷10或者更多个骰子,试问如何快速求解各种结果出现的概率呢?
R语者为你提供深度答案

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 读书笔记(R语言) 作者:曾健明公众号: 生信技能树整理原因:在公众号这篇文章中看到如下一段话,自己最近又在练习用...
    6102阅读 1,719评论 0 5
  • 文|程瑞林(山东大学第二医院足踝外科)来源|(微信公众号)云中瑞麟(ID:ruilinfly) 瑞麟导读:对于计量...
    云中瑞麟阅读 146,432评论 10 69
  • 简单材料: 陈*先生:1965年出生,中国国籍,无永久境外居留权,本科学历。1985年7月至1995年2月,任安徽...
    R语者阅读 241评论 0 0
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,605评论 28 53
  • 信任包括信任自己和信任他人 很多时候,很多事情,失败、遗憾、错过,源于不自信,不信任他人 觉得自己做不成,别人做不...
    吴氵晃阅读 6,227评论 4 8