8

我必须编写以下方法的函数:

拒收方式(统一包络)

假设 fx 仅在 [a, b] 和 fx ≤ k 上非零。

  1. 生成与 X 无关的 X ∼ U(a, b) 和 Y ∼ U(0, k)(因此 P = (X, Y ) 均匀分布在矩形 [a, b] × [0, k] 上)。

  2. 如果 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 < fx(x)) 不正确,则该方法建议再次重复循环以再次生成统一数。(y < fx(x)) 不为真=假。那么为什么不会出现这种情况while (FALSE)呢?

再次,我将在哪个基础上进入 while 循环?也就是说,我习惯了这个

   a=5 
   while(a<7){
      a=a+1
   }

在这里,我在编写条件 (a<7) 之前定义了 a 。

但是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)
4

2 回答 2

15

这是一个无限循环。只要条件的计算结果为 ,表达式就会执行TRUE,它总是会这样做。然而,在表达式中有一个return,当被调用(例如, if 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"

当这个函数被调用时会发生什么?

  1. i设置为 1。
  2. while测试循环的条件。因为它是TRUE,所以它的表达式被评估。
  3. if测试构造的状况。因为它是FALSE表达式else被评估并被i打印。
  4. i增加 1。
  5. 重复步骤 3 和 4。
  6. i达到值 4 时,将评估构造if的条件。这将停止整个函数并返回值“停止”。 TRUEreturn("stopped")
于 2013-09-22T09:42:22.443 回答
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;
}
于 2015-04-02T04:56:39.933 回答