有人可以帮我这个吗?假设“p”是完全外源的并且遵循均匀分布。然后我想生成“z”,它是一个TRUE(= 1)或FALSE(= 0)虚拟,并具有每三个元素(1-3,4-6,7-9,...)的总和的属性。 ......,58-60)“z”应大于0.
例如,如果我得到像{1 0 0 1 1 0 0 0 0 0 1 0 ...}这样的“z”,我希望再次重复循环(因为sum(z [7:9]) = 0)绘制一个不同的“错误”,直到我得到一个新的“z”,如{1 1 0 0 0 1 0 1 0 1 0 0 ...},其中每三个元素的所有求和都大于0。我用的如下。我哪里错了?
set.seed(005)
p<-runif(60, 0, 1)
for (i in 1:20) {
repeat {
error= -0.2*log((1/runif(60, 0, 1))-1) # a random component
z=(p<0.5+error) # TRUE/FALSE condition
z=replace(z, z==TRUE, 1) # replace z to 1 if z is true, else z=0
if (sum(z[(3*i-2):(3*i)])>0) {break}
}
}
答案 0 :(得分:4)
你的for循环为每个i生成一个新的z。我不认为那是你想要做的。根据我的理解,你试图生成一个新的z然后使用for循环与计数器i来检查三个连续元素的总和。如果是这样,那么你需要有一个循环来生成新的z,然后在这个循环中另一个循环来检查三个连续元素的总和。
我认为这可以满足您的需求。但是当我运行它时,你很快就会得到满意的z。
set.seed(005)
p<-runif(60, 0, 1)
invalidentriesexist =1
while(invalidentriesexist == 1) {
error = -0.2*log((1/runif(60, 0, 1))-1) # a random component
z=(p<0.5+error) # TRUE/FALSE condition
z=replace(z, z==TRUE, 1) # replace z to 1 if z is true, else z=0
z=replace(z, z==FALSE, 0) # replace z to 1 if z is true, else z=0
invalidentriesexist = 0
i = 1
while ( i <=20 & invalidentriesexist == 0 ) {
invalidentriesexist = 0
if (sum(z[((3*i)-2):(3*i)])==0) {invalidentriesexist = 1}
cat(i,'\n')
cat(invalidentriesexist,'\n')
cat(paste(z,collapse = ","),'\n')
cat(z[((3*i)-2):(3*i)],'\n\n')
i = i + 1
}
}