R-二十一点卡采样

时间:2018-07-19 18:37:52

标签: r

五张纸牌查理是您抽五张纸牌而不会破产的地方,即5张纸牌中的点是<=21。我想通过蛮力找到5张纸牌查理的概率-即模拟一个大次数,然后检查您是否破产。

通过使用蛮力使用R。我在这里假设有4个牌组,在娱乐场中很常见,我从这4个牌组中抽取5张牌,检查它们是否中了牌,是否算入了概率。谷歌搜索表明它应该在1/50左右,即2%:

deck <- c(rep(1:9, 16), rep(10, 64))
n <- 0 
size <- 1:10e6

for (i in size){
  smpl <- sample(deck,5,replace = F)
  if (sum(smpl) <= 21){
    n <- n+1
  }
}

print(n/max(size) * 100)

[1] 5.98644

请注意,这里的“套牌”是积分系统,即我们有1:9的积分可用于4套西服,并且4张牌组因此需要1:9的16倍,同样,杰克·王后国王和“十”都算作十,但是4 * 4 * 4张可能的卡。

对5张无替换样本的卡进行抽样检查,检查总和是否等于21,如果算出总数,则最后进行1000万次并计算概率。但这只占6%,而不是2%。

我有两个问题:

1)我该如何修改它以便可以采样一亿或更多的剧本?

2)我有6%的概率在哪里出错?

2 个答案:

答案 0 :(得分:0)

我认为这里的假设是应该为2%。

您的代码说大约5%。我改编了existing answer,它也说5%:

deck       <- c(rep(1:9, 4), rep(10, 16))
result     <- combn(deck, 5, function(x) {sum(x) <= 21})

sum(result)/dim(result)
[1] 0.05385693

答案 1 :(得分:0)

对于k = 5, 6, 7-卡查理,您可以尝试使用replicate进行以下操作(通过模拟计算概率):

sapply(5:7, function(k) mean(replicate(n=10^6, 
                           sum(sample(c(rep(1:9, 4), rep(10, 16)), k, replace = F)) <= 21)))
#[1] 0.053943 0.008525 0.000890

这是概率随着k降低(对于k卡查理)

library(ggplot2)
ggplot(aes(card, prob), 
      data=data.frame(card=2:7, prob=sapply(2:7, function(x) mean(replicate(n=10^6, sum(sample(c(rep(1:9, 4), rep(10, 16)),x,replace = F)) <= 21))))) + 
      geom_point() + geom_line()

enter image description here