我想模拟不同的扑克牌。通过痛苦的试验和错误,我获得了排名,套装,套牌以及绘制任何给定数量的牌的功能:
suits <- c("spd","hrt","dimd","clbs")
ranks <- c(1:10,"J","Q","K")
deck <- as.matrix(expand.grid('rank' = ranks, 'suit' = suits))
draw <- function (n) deck[sample(nrow(deck), n), ]
draw(5) # Drawing 5 cards from the deck...
输出:
rank suit
[1,] "4" "dimd"
[2,] "6" "dimd"
[3,] "8" "spd"
[4,] "K" "hrt"
[5,] "8" "clbs"
现在我想通过模拟找出获得不同手牌的概率。我确实想出了一些counter for the number of successes
的可能循环,但我被卡住了。
这是一个例子......让我试着弄清楚我在1000次模拟中得到了多少满屋。由于满屋被定义为&#34;一个等级的三张匹配卡和另一等级的两张匹配卡&#34;,我认为该函数的关键部分是在if
内有一个布尔值利用R函数unique()==2
的意思,意味着2个独特的排名 - 有5张牌,2个独特的排名可以是满堂红(另一种可能性是其他排名中的四种)。 / p>
iterations <- 1000
counter <- 0
for (i in iterations){
s <- draw(5)
if(length(unique(s[,1])) == 2) counter <- counter + 1
}
counter
输出:[1] 0
我已尝试过多个其他内容,包括成功案例的counter[i] <- 1
,以及最后运行sum(counter)
的想法,但都没有让循环生效。
答案 0 :(得分:1)
在您的代码中,您有:
for(i in 1000) {
print(i)
} # 1000
它只打印一次,因为i
会以1000
迭代一次。
以下是使用rle
的替代方法。
iterations <- 10000
draws <- list()
for (i in 1:iterations){
s <- draw(5)
draws[[i]] <- all(rle(sort(s[,1]))$lengths %in% c(2,3))
if(draws[[i]]) {
print(s)
}
}
summary(unlist(draws))
答案 1 :(得分:1)
使用如下数据框,它似乎产生您正在寻找的结果:
suits <- c("spd","hrt","dimd","clbs")
ranks <- c(1:10,"J","Q","K")
deck <- as.data.frame(expand.grid('rank' = ranks, 'suit' = suits))
draw <- function (n) deck[sample(nrow(deck), n), ]
counter <- 0;
for (i in 1:1000) {
df <- draw(5);
counter <- counter + (length(unique(df$rank)) == 2)
}
counter
[1] 156
答案 2 :(得分:0)
suits <- c("spd","hrt","dimd","clbs")
ranks <- c(1:10,"J","Q","K")
deck <- as.data.frame(expand.grid('rank' = ranks, 'suit' = suits))
draw <- function (n) deck[sample(nrow(deck), n), ]
iterations <- 1000
counter <- 0
for (i in 1:iterations) {
hand <- draw(5)
rank_table <- table(hand[, 1])
if (length(names(rank_table)) == 2 & min(rank_table) > 1) counter <- counter + 1
# could have four of a rank, one of another;
# need to ensure two of a rank, three of another
}
counter
[1] 1
此结果与预期http://www.math.hawaii.edu/~ramsey/Probability/PokerHands.html
的距离不远