2016-08-08 5 views
0

Я новичок в R, и я занимаюсь практическим вопросом. Рассчитайте вероятность рисования двух лицевых карт (Джек, Королева, Царь) в строке. Имитировать стандартную колоду из 52 карт (без джокеров). Выполните выборку двух карт из колоды 1000 раз (помните, что мы не заменяем карту после рисования). Как была проведена пропорциональная пропорция в два раза по сравнению с вероятностью, которую вы рассчитали? Это то, что я пробовал:Вычислить вероятности в программировании R

poker <- c(1:10, "J", "Q", "K") 

poker_face <- sample(poker, size = 1000, replace = FALSE) 

это дает мне:

Error in sample.int(length(x), size, replace, prob) : cannot take a 
sample larger than the population when 'replace = FALSE' 
+0

Любая помощь с благодарностью! :) –

ответ

1

Я думаю, что это то, что вы действительно хотите:

poker_face <- replicate(1000, sample(poker, size =2, replace = FALSE)) 

Вы хотите повторить эксперимент в 1000 раз, не пример 1000 карт без замены колоды. Итак, здесь есть концептуальное недоразумение. replicate выше даст вам матрицу из двух строк и 1000 столбцов, где каждый столбец является результатом одного из 1000 экспериментов.

Чтобы вычислить необходимую вам вероятность, вам нужно количество симуляций, которые дают вам лицевые карты. Как насчет:

m <- sum(colSums(matrix(poker_face %in% c("J", "Q", "K"), nrow = 2)) == 2) 

Тогда m/1000 оценка вероятности на основе ваших моделей.

+0

Спасибо !!! Теперь я получаю все вероятности, но у меня проблемы с получением лица. Как я мог получить лицо в покер? –

+0

Это действительно работает. спасибо! Но не могли бы вы объяснить, что для меня, пожалуйста? % In% stuff выглядит запутанным. –

1

покер вектор длины 13. Вы пытаетесь взять образец размером 1000 от 13 без замены. Вопрос задает образец размером 2, 1000 раз.

Попробуйте следующую строку кода ...

sample(poker, size = 2, replace = FALSE) 

... затем повторите эту функцию в 1000 раз, чтобы получить долю времени две открытые карты были сделаны.

+1

Спасибо, что помогли мне! –

2

Вместо того, чтобы вытаскивать 2 карты из своей колоды без замены, ваш код пытается вытащить 1000 карт, не помещая ни одной спины. Поскольку колода не имеет 1000 карт для рисования, она не может взять образец.

Чтобы проиллюстрировать это, попробуйте уменьшить 1000 до меньшего числа (например, 2) и посмотреть, не исчезла ли ошибка. Вы захотите повторить этот тест 1000 раз.

Также обратите внимание, что ваша колода составляет 13 карт вместо 52. Если вы просто взяли одну карту (или заменили ее потом), это не повлияло бы на шансы; все равно даже шансы на получение какой-либо данной стоимости. Но так как вы отбираете две карты без замены, вам понадобится полная колода.

Скажите, что первая карта, нарисованная, является королем. Теперь вместо 3 королей и 4 всего остального вы делаете вторую ничью без доступных королей и 1 всего остального.

+0

Я вижу. Я сделаю колоду! спасибо! :) –

1

Потому что я не могу комментировать, я хотел добавить к ответу Чжэюань Ли и объяснить% в%, о котором вы спрашивали.

% in% устанавливает логический выбор соответствия, поэтому он возвращает true/false для каждой ячейки в матрице, которая содержит один из символов в списке c().

Другой способ думать об этом, если сравнить его с этой grepl() заявление:

m <- sum(colSums(matrix(grepl("J|Q|K", poker_face), nrow = 2)) == 2) 

Это же, как и оригинальной строки кода:

m <- sum(colSums(matrix(poker_face %in% c("J", "Q", "K"), nrow = 2)) == 2) 

За исключением Я используя grepl(), чтобы указать, соответствуют ли ячейки в матрице «J», «Q» или «K».

Вы можете увидеть больше на% in% путем поиска? Match()

+0

Спасибо за ваше объяснение !!! –

Смежные вопросы