介绍

投掷骰子游戏,首先一个人将两个骰子随机抛掷第一次,如果出现点数和为 5 或者 11,则赢得游戏,游戏结束。如果没有出现 5 或 11,那么继续抛掷,如果点数与第一次抛的点数一样大,则赢得游戏,游戏结束,如果点数为 5 或 11 则输掉游戏,游戏结束。如果出现其他情况,则继续抛掷,直到游戏结束为止。

代码

craps <- function() {
  # returns TRUE if you win, FALSE otherwise
  initial.roll <- sum(sample(1:6, 2, replace = T))
  if (initial.roll == 5 || initial.roll == 11)
    return(TRUE)
  while (TRUE) {
    current.roll <- sum(sample(1:6, 2, replace = T))
    if (current.roll == 5 || current.roll == 11) {
      return(FALSE)
    } else if (current.roll == initial.roll) {
      return(TRUE)
    }
  }
}

演示

mean(replicate(1000, craps()))
## [1] 0.527

点评

要开始掷骰子喽~这段小程序运用 R 的随机抽样的功能来让一时半会儿找不到骰子的大家过一把掷骰子游戏的瘾。

首先从代码上说说这个程序。这段代码写起来看着也是听舒服的,sample() 函数的 replace 选项将抽样设定为重复抽样,即抽取之后不从总体中剔除已抽取的样本,这就实现了骰子的重复投掷效果,可见作者对 sample() 函数也是有一定了解了的。其次,while 循环也用得恰到好处,让投掷过程不断重复,直到的出胜负结果。

我们再来从用户角度来看看。这整个游戏过程都是在程序内部进行自动计算和判断,并没有为用户提供什么输出,只是最后给出一个胜负结果,这会使其对用户而言少了一些趣味性。我觉得可以适当增加一些输出提示,譬如第一次投掷后给用户输出初次投掷的结果,然后每次投掷给出和第一次的对比等等,这样会使游戏更加有意思~

最后来扯点别的,其实我很想知道为什么会选择 5 和 11 这两个数和这样一个结果判断方法,根据这个规则来算算胜负概率或许也是个很有意思的话题吧~