首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包含"if“和"while”的For循环运行数小时

包含"if“和"while”的For循环运行数小时
EN

Stack Overflow用户
提问于 2019-05-16 20:29:59
回答 3查看 61关注 0票数 0

我有一个for循环,包括为问题编写的“if”和“while”子句。它打算在某些条件下进行1000次模拟。我认为这不是一个非常复杂的循环,但它已经运行了近16个小时,没有显示结果或提示错误/警告(并且一直显示小的红色停止标志),我可以感觉到自从我开始运行循环以来,我的笔记本电脑变慢了。

所以我想知道这是不是真的会发生,或者我的代码或笔记本电脑有什么问题。非常感谢您的帮助!

代码见下文:

代码语言:javascript
复制
result.Vec <- NULL
for (trials in 1:1000) {
  sum <- 0
  sum2 <- 0
  n <- 0
  tmp1 <- sample(x=c(1, 2, 3, 4, 5, 6), size=1, replace=T, prob=c(1/6, 1/6, 1/6, 1/6, 1/6, 1/6)) 
  tmp2 <- sample(x=c(1, 2, 3, 4, 5, 6), size=1, replace=T, prob=c(1/6, 1/6, 1/6, 1/6, 1/6, 1/6)) 
  sum <- tmp1 + tmp2
  if (sum == 7 || sum == 11) {
    n <- 1
   } else if (sum == 2 || sum == 3 || sum == 12) {
    n <- 0
   } else {
     while (sum2 != sum || sum2 != 7) {
       tmp1 <- sample(x=c(1, 2, 3, 4, 5, 6), size=1, replace=T, prob=c(1/6, 1/6, 1/6, 1/6, 1/6, 1/6)) 
       tmp2 <- sample(x=c(1, 2, 3, 4, 5, 6), size=1, replace=T, prob=c(1/6, 1/6, 1/6, 1/6, 1/6, 1/6)) 
       sum2 <- tmp1 + tmp2
       if (sum2 == sum) {
         n <- 1
       } else if (sum2 == 7) {
         n <- 0
       }
     }
   }
  result.Vec <- c(result.Vec, n)
}

请看下面的问题,我的循环是为了作为参考(不是寻求这个问题的解决方案):骰子游戏掷骰子游戏如下。玩家掷两个骰子,如果和是七或十一,她就赢了。如果和是2、3或12,那么她就输了。如果和是其他的,那么她继续掷,直到她再次抛出这个数字(在这种情况下她赢了)或者她抛出一个7(在这种情况下她输了)。基于1000次模拟计算玩家获胜的概率。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-05-16 21:02:41

正如我在评论中提到的,问题只是出在while循环中的条件上。它应该是AND而不是OR,否则while循环总是会失败。我已经测试过了,它是有效的:

代码语言:javascript
复制
result.Vec <- NULL
for (trials in 1:1000) {
  print(trials)
  sum <- 0
  sum2 <- 0
  n <- 0
  tmp1 <- sample(x=c(1, 2, 3, 4, 5, 6), size=1, replace=T, prob=c(1/6, 1/6, 1/6, 1/6, 1/6, 1/6)) 
  tmp2 <- sample(x=c(1, 2, 3, 4, 5, 6), size=1, replace=T, prob=c(1/6, 1/6, 1/6, 1/6, 1/6, 1/6)) 
  sum <- tmp1 + tmp2
  if (sum == 7 | sum == 11) {
    n <- 1
  } else if (sum == 2 | sum == 3 | sum == 12) {
    n <- 0
  } else {
    while (sum2 != sum & sum2 != 7) {
      tmp1 <- sample(x=c(1, 2, 3, 4, 5, 6), size=1, replace=T, prob=c(1/6, 1/6, 1/6, 1/6, 1/6, 1/6)) 
      tmp2 <- sample(x=c(1, 2, 3, 4, 5, 6), size=1, replace=T, prob=c(1/6, 1/6, 1/6, 1/6, 1/6, 1/6)) 
      sum2 <- tmp1 + tmp2
      if (sum2 == sum) {
        n <- 1
      } else if (sum2 == 7) {
        n <- 0
      }
    }
  }
  result.Vec <- c(result.Vec, n)
}
票数 0
EN

Stack Overflow用户

发布于 2019-05-16 20:56:55

首先,为了加速代码,你应该去掉外部的for循环。取而代之的是,使用模拟一个游戏的函数,然后使用replicate来运行游戏n次。

其次,使用break退出while循环。另外,请注意,将变量命名为sum并不明智,因为已经有一个名为sum的R函数。

下面是我的代码版本:

代码语言:javascript
复制
simulate_game <- function(){

  tmp1 <- sample(x = 1:6, size = 1) 
  tmp2 <- sample(x = 1:6, size = 1) 

  mysum <- tmp1 + tmp2

  if (mysum %in% c(7, 11)) {
    n <- 1
  } else if (mysum  %in% c(2, 3, 12)) {
    n <- 0
  } else {
    mysum2 <- 0

    while (! mysum2 %in% c(mysum, 7)) {
      tmp1 <- sample(x = 1:6, size = 1) 
      tmp2 <- sample(x = 1:6, size = 1) 

      mysum2 <- tmp1 + tmp2

      if (mysum2 == mysum) {
        n <- 1; break()
      } else if (mysum2 == 7) {
        n <- 0; break()
      }
    }
  }

  return(n)
}

现在您可以使用以下命令来模拟1000次运行:

代码语言:javascript
复制
set.seed(1)
table(replicate(1000, simulate_game()))
      0   1 
     530 470

请注意,我使用set.seed设置了一个随机种子。这使得你的结果是可重复的。

票数 2
EN

Stack Overflow用户

发布于 2019-05-16 20:42:40

while循环被卡住了:

代码语言:javascript
复制
while (sum2 != sum || sum2 != 7)

如果sum != 7(对于几乎任何可能的值,都是如此),它将始终计算为TRUE。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56168611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档