2017-01-08 3 views
1

Я смотрел this problem (скопировал ниже) и хочу помочь с его функциональным моделированием (в частности, в R).Мышление функционально в R с моделированием перетасовки колоды

В снежные дни вы любите играть в пасьянс «игра» со стандартной случайной перетасованной колодой из 52 карт. Вы начинаете раздавать карты лицом вверх, по одному, в кучу. Когда вы делаете все карты, вы также говорите вслух, чтобы 13 карт стояли в стандартной колоде: туз, два, три и т. Д. (Когда вы добираетесь до короля, вы начинаете с туза.) Вы продолжаете делать это до тех пор, пока ранг карты, которую вы делаете, соответствует рангу, в котором вы говорите вслух, и в этом случае вы проигрываете. Вы выигрываете, если достигнете конца колоды без каких-либо матчей.

Какова вероятность того, что вы выиграете?

Делать это с помощью для цикла кажется простым - в каждом цикле, построить палубу через rep(seq(13),4), переставлять ее, а затем проверить, если какие-либо из записей между переставленной и непереставленной палубой равно. Меня особенно интересует функциональный подход к этому. Для этого я решил построить x <- rep(seq(13),4) один раз, сделав таблицу размером n, где каждый столбец равен sample(x), а затем найдите способ проверить каждый столбец, если sample(x) ~ x, где через ~ Я имею в виду «иметь хотя бы один общий элемент, что означает, что индекс и значение равны ». Это, мы надеемся, вернет true/false в зависимости от того, является ли это true или false.

Так, ~, если бы он назвал compare(x,y), я бы хотел compare(c(1,2,3),c(3,1,2)) быть ложным, и compare(c(1,2,3,4,5),c(8,9,10,11,5)), чтобы быть правдой.

Итак, мои вопросы:

  1. Что такое хороший (функциональный) способ реализации сравнить?

  2. Есть ли лучший способ подойти к этой проблеме функционально?

ответ

2

Идиоматические R код является функциональным в том смысле, что она включает в себя побочный эффект свободных функций (которые часто являются анонимными), векторизация кода и интенсивное использование функций в apply семье (которая является R- версия map, одна из объединяющих тем в функциональном программировании). Вы можете сделать моделирования что-то вроде этого:

x = rep(1:13,4) 
deranged <- function(x,y){all(x!=y)} 
samples <- replicate(10000,sample(x,52)) 
wins <- apply(samples,2,function(y){deranged(x,y)}) 
p <- sum(wins)/10000 

На моем последнем прогоне p оценивается в 0.017