我有一个for循环,其中包括针对问题编写的“ if”和“ while”子句。它打算在某些条件下进行1000次仿真。我认为这不是一个非常复杂的循环,但是它已经运行了将近16个小时,没有显示结果或提示错误/警告(并且一直显示红色的停止符号),我可以感觉到自从我开始执行循环操作以来,笔记本电脑的速度一直减慢。
所以我想知道这是否可能真正发生,或者我的代码或笔记本电脑是否有问题。任何帮助是极大的赞赏!!
请参见下面的代码:
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)
}
请参阅以下有关我的循环作为参考的问题(不寻求解决此问题的方法): 骰子游戏骰子的游戏如下。玩家投掷两个骰子,如果总和是7或11,则她获胜。如果总和是2、3或12,那么她输了。如果总和不算什么,那么她会继续投掷直到再次投掷那个数字(在这种情况下她赢了)或她投出了7(在这种情况下她输了)。根据1000次模拟计算玩家获胜的概率。
答案 0 :(得分:2)
首先,为了加速代码,您应该摆脱外部的for循环。而是使用模拟一个游戏的功能,然后使用replicate
来运行游戏n
次。
第二,使用break
退出while循环。另外,请注意,命名变量sum
是不明智的,因为已经有一个名为sum
的R函数。
这是我的代码版本:
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次跑步:
set.seed(1)
table(replicate(1000, simulate_game()))
0 1
530 470
请注意,我使用set.seed
设置了随机种子。这样可以使您的结果可重复。
答案 1 :(得分:0)
while循环卡住了:
library("partykit")
ct <- ctree(bikecount ~ df.weather$temp + df.weather$weekday + df.weather$rain,
data=training.data)
plot(ct)
如果sum!= 7(几乎是所有可能的值),则总为TRUE。
答案 2 :(得分:0)
正如我在评论中提到的那样,问题只在于while循环中的条件。应该是AND而不是OR,否则while循环将始终失败。我已经对此进行了测试,并且可以正常工作:
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)
}