我正在尝试制作一个简单的抛硬币程序。 一旦“正面”或“反面”达到 3,抛硬币 while 循环就会关闭。 使用sample()中的随机整数生成1或2以添加到正面或反面的计数中是有意义的。
问题是 coin_flip 在 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}
}
您有 2 个问题:
仅当您为其分配新值
coin_flip
时,coin_flip <- ...
的值才会更改。唯一一次分配随机值是在循环之前。如果您想每次通过循环获得一个新的随机值,则需要在循环内部进行。
相关,我们使用<-
==
来测试相等性。您在
<-
语句中使用 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
}
这是一个用 Python 编写的虚拟硬币翻转的简单代码: