我必须编写以下方法的函数:
拒绝方法(统一信封):
假设fx仅在[a,b]和fx≤k上非零。
独立于X生成X~U(a,b)和Y~U(0,k)(所以P = (X,Y)均匀分布在矩形[a,b]×[0,k])上。
如果Y< fx(x)然后返回X,否则返回步骤1.
rejectionK <- function(fx, a, b, K) {
# simulates from the pdf fx using the rejection algorithm
# assumes fx is 0 outside [a, b] and bounded by K
# note that we exit the infinite loop using the return statement
while (TRUE) {
x <- runif(1, a, b)
y <- runif(1, 0, K)
if (y < fx(x)) return(x)
}
}
我还不明白为什么TRUE
中有while (TRUE)
?
如果(y
再次以哪种方式进入while循环?也就是说,我习惯了这个
a=5
while(a<7){
a=a+1
}
这里我在写入条件(a&lt; 7)之前定义了一个。
但在while (TRUE)
中,哪个陈述是真的?
此外:
您可以运行代码
rejectionK <- function(fx, a, b, K) {
# simulates from the pdf fx using the rejection algorithm
# assumes fx is 0 outside [a, b] and bounded by K
# note that we exit the infinite loop using the return statement
while (TRUE) {
x <- runif(1, a, b)
y <- runif(1, 0, K)
cat("y=",y,"fx=",fx(x),"",y < fx(x),"\n")
if (y < fx(x)) return(x)
}
}
fx<-function(x){
# triangular density
if ((0<x) && (x<1)) {
return(x)
} else if ((1<x) && (x<2)) {
return(2-x)
} else {
return(0)
}
}
set.seed(123)
rejectionK(fx, 0, 2, 1)
答案 0 :(得分:10)
这是一个无限循环。只要条件求值为TRUE
,表达式就会执行,它将始终执行。但是,在表达式中有一个return
,当被调用时(例如,如果y < fx(x)
),则会突破该函数,从而停止循环。
这是一个更简单的例子:
fun <- function(n) {
i <- 1
while (TRUE) {
if (i>n) return("stopped") else print(i)
i <- i+1
}
}
fun(3)
#[1] 1
#[1] 2
#[1] 3
#[1] "stopped"
调用此函数会发生什么?
i
设置为1。while
循环的条件。因为它是TRUE
,所以它的表达式被评估。 if
构造的条件。由于FALSE
评估else
表达式并打印i
。i
增加1。i
达到值4时,if
构造的条件为TRUE
并评估return("stopped")
。这将停止整个函数并返回值“已停止”。 答案 1 :(得分:4)
在while循环中,如果我们有带有true或false的return语句..它将相应地工作..
示例:要检查列表是否为循环..
这里循环是无限的,因为while(true)总是为真,但我们有时可以通过使用return语句来破坏。
while(true)
{
if(!faster || !faster->next)
return false;
else
if(faster==slower || faster->next=slower)
{
printf("the List is Circular\n");
break;
}
else
{
slower = slower->next;
faster = faster->next->next;
}