Использование Монте-Карло для определения вероятности получения 2 тузов при игре в блэкджек - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь выяснить вероятность получения 2 тузов при игре в блэкджек. Я не уверен, как настроить функцию семпла, но я подумал, что, поскольку у меня есть только две возможности иметь два туза или нет, я бы использовал 1 для да и -1 для нет. Я думал, что вы установили замену равной 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 из кода.

1 Ответ

0 голосов
/ 17 октября 2019

Если вместо этого мы используем {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

Определить, если это оба туза, тогда может быть 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 в это ожидаемое значение.)

...