R语言 循环时随机抛硬币

fdx2calv  于 2023-05-04  发布在  其他
关注(0)|答案(1)|浏览(220)

我在做一个简单的抛硬币程序。一旦“正面”或“反面”达到3,则抛硬币while循环关闭。使用sample()中的随机整数生成1或2来添加到正面或反面的计数中是有意义的。
问题是,在while循环的后续迭代中,coin_flip似乎没有改变。所以我的问题是我怎样才能做到:

  1. coin_flip实际上在while循环的后续迭代中改变
    1.我没有收到两个“头”!'和'Tails'在while循环的每次迭代中
    感谢罗汉
    这是我的代码
heads <- 0
tails <- 0
coin_flip <- sample(1:2, 1)
print(coin_flip)

while (heads < 3 & tails < 3) {
  coin_flip
  print(coin_flip)
  if (coin_flip <- 1) {
    print ('Heads!')
    heads = heads + 1 }
  if (coin_flip <- 2) {
    print ('Tails!')
    tails = tails + 1}
}
6yt4nkrj

6yt4nkrj1#

你有两个问题

  1. coin_flip的值只有在您为其分配新值coin_flip <- ...时才会更改。唯一一次你分配一个随机值是在**循环之前。如果你想在每次循环中得到一个新的随机值,那就需要在循环中发生。
    1.相关的,我们使用<-赋值,==测试相等性。您在if()语句中使用了<-,因此您正在赋值。我们需要使用==来测试是否相等。
    您的代码if (coin_flip <- 1)coin_flip <- 1; if(coin_flip)相同,if()将把任何非零数字视为TRUE
    修复这些,我们得到这个:
heads <- 0
tails <- 0
while (heads < 3 & tails < 3) {
  coin_flip <- sample(1:2, 1)
  print(coin_flip)
  if (coin_flip == 1) {
    print ('Heads!')
    heads = heads + 1 }
  if (coin_flip == 2) {
    print ('Tails!')
    tails = tails + 1}
} 
# [1] 2
# [1] "Tails!"
# [1] 1
# [1] "Heads!"
# [1] 2
# [1] "Tails!"
# [1] 1
# [1] "Heads!"
# [1] 1
# [1] "Heads!"

如果我们想简化一点,我会说,当我们可以直接从“头”和“尾”中采样时,没有理由对数字进行采样。对于有关代码如何运行的单行注解,我通常更喜欢message()而不是print()。这将允许我们删除一些不必要的位,如下所示:

heads <- 0
tails <- 0
while (heads < 3 & tails < 3) {
  coin_flip <- sample(c("Heads", "Tails"), 1)
  message(coin_flip)
  if (coin_flip == "Heads") {
    heads = heads + 1
  }
  if (coin_flip == "Tails") {
    tails = tails + 1
  }
} 
# Heads
# Tails
# Heads
# Heads

这里更简洁一点,使用一个命名向量作为结果,而不是两个单独的对象。这使我们可以完全跳过if()语句,使用结果作为名称来递增正确的值。

results = c("Heads" = 0, "Tails" = 0)
while (all(results < 3)) {
  coin_flip <- sample(c("Heads", "Tails"), 1)
  message(coin_flip)
  results[coin_flip] <- results[coin_flip] + 1
}

相关问题