双骰儿是一种常见的概率游戏,玩家同时投掷两个骰子,正面数字之和满足某种给定的条件即赢或者输。
假设规则是掷出2或者11,赢得投入的两倍;掷出3,5或者12,投入就成肉包子打狗;其他数字不输不赢。
在一次性游戏中玩家输赢的概率分别是多少,这如何通过R来计算呢?
这就带你体验当Rain Man的感觉!
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)))
#掷出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语者为你提供深度答案