R - 使用If语句循环并跟踪成功的次数

时间:2016-01-31 22:30:04

标签: r loops

我想模拟不同的扑克牌。通过痛苦的试验和错误,我获得了排名,套装,套牌以及绘制任何给定数量的牌的功能:

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)的想法,但都没有让循环生效。

3 个答案:

答案 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

的距离不远