改变掷骰子的值

Changing values of a dice roll

假设我掷了 5 个骰子。

模拟翻滚的代码是

Rolls<-sample(1:6, 5, replace=TRUE)

那就是如果我想将我的卷存储在对象 Rolls 下。

现在假设出于某种原因我不希望有超过 2 个六。这意味着如果我滚动,例如,6 3 5 6 6 1,我是否能够将 6 个值之一重新滚动为一个新值,以便只有 2 个 6 值和 4 个不是 6 的值?

如有任何支持,我们将不胜感激。

提前致谢

如果我理解正确,那应该可以:

n <- 10
(Rolls<-sample(1:6, n, replace=TRUE))
#>  [1] 6 2 4 1 1 6 5 2 1 6
(Nr_of_six <- sum(6 == Rolls))
#> [1] 3

while (Nr_of_six > 1) {
    extra_roll <- sample(1:6, 1, replace=TRUE)
    second_six <- which(Rolls==6)[2]
    Rolls[second_six] <- extra_roll
    print(Rolls)

    Nr_of_six <- sum(6 == Rolls)
}
#>  [1] 6 2 4 1 1 4 5 2 1 6
#>  [1] 6 2 4 1 1 4 5 2 1 3
print(Rolls)
#>  [1] 6 2 4 1 1 4 5 2 1 3

reprex package (v1.0.0)

创建于 2021-03-21

没有循环的解决方案可以是:

condition = which(Rolls==6)
if(length(condition)>=3){
  Rolls[condition[3:length(condition)]] = sample(1:5, length(condition)-2, replace=TRUE)
}

condition 用 6 表示 Rolls 中的位置,如果超过 2 个,你 select 第三个 Rolls[condition[3:length(condition)]] 并重新采样。

第二个问题可以是这样的:

remove = 3
Rolls = Rolls[-which(Rolls==remove)[1]]

如果你愿意,你可以轻松地将它们放入函数中

编辑 1

为了使第二个答案更具交互性,您可以为其构建一个函数:

remove.roll = function(remove, rolls){
   rolls = rolls[-which(rolls==remove)[1]]}

然后用户可以随心所欲地调用函数 remove。您还可以制作一个从提示中获取信息的程序:

remove = readline(prompt="Enter number to remove: ")
print(Rolls = Rolls[-which(Rolls==remove)[1]])

我们可以将其作为 scan() 用例的有趣演示。您可以输入要替换的值的位置。请注意,您需要逐个输入 scan() 每个位置值,并在输入后按回车,最后您可以通过输入一个空字符串 "" 并按回车来结束输入。

代码

dice.roll <- function(){
  # Initial toss
  Rolls <- sample(seq(1, 6), 5, replace=TRUE)
  
  # Communicate
  cat("The outcome of the dice roll was:", "\n\n", Rolls, "\n\n", 
      "would you like to reroll any of those values ?", "\n",
      "If yes enter the positions of the values you would \n like to replace, else just input an empty string.")
  
  # Take input 
  tmp1 <- scan(what = "")
  
  # Replace
  Rolls[as.numeric(tmp1)] <- sample(seq(1, 6), length(tmp1), replace=TRUE)
  
  # Return
  cat("You succesfully replaced", length(tmp1), "elements. Your rolls now look as follows: \n\n", 
      Rolls)
}

dice.roll()

# The outcome of the dice Roll was: 
#
#  6 4 6 3 4 
#
#  would you like to reroll any of those values ? 
#  If yes enter the positions of the values you would 
#  like to replace, else just input an empty string.
# 1: 1
# 2: 3
# 3: ""
# Read 2 items
# You succesfully replaced 2 elements. Your set now looks as follows 
#
#  2 4 2 3 4

请注意,此功能只是快速编写以正确实现此功能,您应该使用 while 语句或 recursion 来根据需要重复替换。此外,在实际使用这个之前,必须插入 if 语句来处理太长的输入和其他可能导致错误的用户行为。

这是我的这个函数的版本,它使用递归来滚动额外的值,因此我们只有不超过 2 个 6s。请注意,我将 rolls 向量放在函数外部,因此为了从函数内部替换第三个、第四个或... 6,我们使用复杂的赋值运算符 <<-。 我个人选择修改第一个 6 中的值 运行 为 3 6s 或更多。

rolls <- sample(1:6, 6, replace = TRUE)

n_six <- function() {
  n <- length(rolls[rolls == 6])
  
  if(n <= 2) {
    return(rolls)
  } else {
    extra <- sample(1:6, 1, replace = TRUE)
    rolls[which(rolls == 6)][1] <<- extra
  }
  n_six()
}

# Imagine our rolls would be a vector with 3 six values like this

rolls <- c(1, 2, 6, 5, 6, 6)

> n_six()
[1] 1 2 3 5 6 6       # First 6 was replaced

# Or our rolls contains 4 six values

rolls <- c(1, 6, 6, 5, 6, 6)

> n_six()
[1] 1 4 1 5 6 6       # First 2 6s have been replaced

等等...