【发布时间】:2014-09-01 07:53:50
【问题描述】:
我正在 R 中创建一个二十一点模拟器。下面的代码成功地创建了我想要的牌组。 (对于那些玩的,我稍后会处理 Ace 的值)。
我的问题是,有没有更好的方法来创建不涉及 while 循环和双 for 循环的牌组?我对双 for 循环有更多的问题。 while 循环可能是不可避免的,因为创建的牌组数量是可变的。
我还初始化了一个空数据框,我知道这不是最佳做法,但是,在这种情况下,数据集非常小,不会影响性能。
最后,R 中是否有 i++ 的等价物?我也一直在用java编程,已经习惯了。
谢谢。
createDeck <- function(totalNumOfDecks = 2)
{
suits <- c("Diamonds", "Clubs", "Hearts", "Spades")
cards <- c("Ace", "Deuce", "Three", "Four","Five",
"Six", "Seven", "Eight", "Nine", "Ten",
"Jack", "Queen", "King")
values <- c(0,2,3,4,5,
6,7,8,9,10,
10,10,10)
deck <- data.frame(Suit=character(0), Card=character(0), Value=numeric(0))
numOfDecks = 1
while (numOfDecks <= totalNumOfDecks){
for (i in suits){
for (j in cards){
deck <- rbind.data.frame(deck, cbind.data.frame(j, i, values[match(j, cards)]))
}
}
numOfDecks = numOfDecks + 1
}
print(deck)
}
【问题讨论】:
-
见
?expand.grid。但坦率地说,只使用 52 个级别的单一因素可能会更容易。 -
如果 josilber 用字符串创建 N 副牌的方法适合你,那么我建议你,因为你可能想在某个时候洗牌,你可以创建一个“洗牌器” " 类似
cardorder<-sample(1:(N*52),N*52)的东西,并使用结果向量重新排序deck行。 -
...只是为了扩展我的评论:我的意思是我可能只使用整数向量 0:51 作为卡片,然后使用模算术来确定花色和等级,以及索引另一个向量来确定值。这可能比推送 data.frame 快得多。
-
@CarlWitthoft - 我不打算洗牌,而是随机取出一张牌。
-
@joran 我对你的想法很感兴趣,但是在这种情况下,模算术有什么帮助呢?我无法建立连接。
标签: r for-loop while-loop