使用蒙特卡洛找出二十一点时被打出2张A的概率

问题描述 投票:0回答:1

我正在尝试在玩二十一点时发现您获得2张A的可能性。我不确定如何设置示例函数,但我想,因为我只有两种可能,要么有两个A,要么没有两个A,那么我将使用1表示是,使用-1表示否。我以为您可以将replace设置为false,因为我们正在使用一个牌组,但这给了我一个不正确的长度错误。如果我能对我要去的地方找到方向,那就太好了。

set.seed(1)
n <- 1000
two_aces <- function(n){
  x <- sample(c(1,-1), 2, replace = TRUE, prob = c(4/52,48/52)) 
}

S <- replicate(10000, two_aces(1000))
mean(S)
mean(S > 0)

我计算了期望值以与平均值进行比较,但是我得到-58.74,这与代码中的-0.85平均值相差甚远。

r montecarlo blackjack
1个回答
0
投票

如果改为使用{0,1}进行否/是的分类,则期望值应为

1*(4/52)*(3/51)

实际上只是与之短路

1*(4/52)*(3/51) + 0*(1 - (4/52)*(3/51))

如果我们使用您的{-1,1}分类,则可以从此转到

1*(4/52)*(3/51) + (-1)*(1 - (4/52)*(3/51))
(4/52)*(3/51) + (-1 + (4/52)*(3/51))
(4/52)*(3/51) + -1 + (4/52)*(3/51)
(4/52)*(3/51) + (4/52)*(3/51) - 1
2*(4/52)*(3/51) - 1

(这也很有意义,因为从1到-1的扩展是原始范围的两倍(2*),并且偏移了一个(-1)。]

[当我用简单的整数模拟卡时(像我经常这样做的声音……虽然不是很真实),我更喜欢从0:51进行编码,因为模数运算符给我们提供了简单的“适合”和“面值”:] >

0:51 %/% 13
#  [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3
0:51 %% 13
#  [1]  0  1  2  3  4  5  6  7  8  9 10 11 12  0  1  2  3  4  5  6  7  8  9 10 11 12  0  1  2  3  4  5  6  7  8  9 10 11 12  0
# [41]  1  2  3  4  5  6  7  8  9 10 11 12

其中0为王牌,12为王。由此,我们可以随机抽取两张牌,并简单地知道它们的花色(如果需要)和面值:

set.seed(3)
s <- sample(0:51, size = 2)
cbind(suit = s %/% 13, face = s %% 13)
#      suit face
# [1,]    0    8  # nine of suit 0
# [2,]    3    2  # three of suit 3

确定这两个都是ace,然后可以是all(s %% 13 < 1)

set.seed(250)
s <- sample(0:51, size = 2)
cbind(suit = s %/% 13, face = s %% 13)
#      suit face
# [1,]    1    0  # ace of suit 1
# [2,]    3    0  # ace of suit 3

all(s %% 13 < 1)
# [1] TRUE

因此可以估算理论概率,我们可以这样做

set.seed(2)
mean(replicate(1000000, all((sample(0:51, size=2) %% 13) < 1)))
# [1] 0.004498
(4/52)*(3/51)
# [1] 0.004524887

,在这种情况下,当分类为0 =否和1 =是时,其计算方法与期望值相同。要和您的{-1,1}一起使用,期望值将是

set.seed(2)
2*mean(replicate(1000000, all((sample(0:51, size=2) %% 13) < 1))) - 1
# [1] -0.991004

(我不认为您应该在此期望值中包含1000个样本量。)

© www.soinside.com 2019 - 2024. All rights reserved.