For循环和While循环选择C中的值

时间:2016-05-03 14:25:06

标签: c if-statement for-loop while-loop

有人可以帮助我查看我在C中编写的代码吗?它可以生成数字,但if条件看似错误,但我不知道如何解决它。

我需要获得一些带有分布的n个随机值,这些值是特殊的间隔,所以我使用for循环如下:

  n=10; mu=2; mu_plus=3; p=0.2;

  for(i=1; i<=n; i++)
    {
    x1 = gasdev(&idum);
    x2 = gasdev(&idum);
    z  = sqrt(1-p*p)*x1 + p*x2 + mu;
    z_p= x2 + mu_plus;

    if (z > 2.17 || z<-2.17) 
     {   
        Z[i]=z; 
        Z_plus[count]=z_p;
     }
  printf("%d %lf %lf\n", i, Z[i], Z_plus[i]);   
}

其中gasdev()是用于生成具有标准正态分布的随机值的函数,Z和Z_plus是1 * n向量。结果很乱,所以我认为IF条件一定是错误的。任何人都可以帮助我吗?谢谢。

我也试过了While循环。

   while(count < n)
    {
      x1 = gasdev(&idum);
      x2 = gasdev(&idum);
      z  = sqrt(1-p*p)*x1 + p*x2 + mu;
      z_p= x2 + mu_plus;

   if (z > 2.17 || z<-2.17) 
   {
       count++;         
       Z[count]=z; 
        Z_plus[count]=z_p;
    }
    printf("%d %lf\n",count, Z[count]);

    if (count >n) break;
  }

它可以正常打印,但最后会出错。

谢谢!

1 个答案:

答案 0 :(得分:1)

这里的错误是你总是将i作为for循环的一部分递增,这样如果z超出了括号集的范围,你就不会在Z数组中加入任何值。你没有指定计数,所以那应该是我或不是?

 private void movePlayerOnMouseClick(Scene scene, Rectangle o, final TranslateTransition transition){
     scene.setOnMousePressed(new EventHandler<MouseEvent>() {
         @Override public void handle(MouseEvent event) {
             transition.setToX(10 * Math.cos(Math.toRadians(0)));
             transition.setToY(10 * Math.sin(Math.toRadians(0)));
             transition.playFromStart();
          }
      });
  }

你的while循环不正确,因为它在n-1时递增计数,并且当你必须将它定义为大小为n的数组时,它会尝试处理Z [n](最大索引是n-1 )。如果不在外面,打印也需要在内部。

  n=10; mu=2; mu_plus=3; p=0.2;

  for(i=1; i<=n; i++)
    {
      x1 = gasdev(&idum);
      x2 = gasdev(&idum);
      z  = sqrt(1-p*p)*x1 + p*x2 + mu;
      z_p= x2 + mu_plus;

      if (z > 2.17 || z<-2.17) 
       {   
          Z[i]=z; 
          Z_plus[count]=z_p; // Should this be Z_plus[i] ??
       }
      // Note that if outside of bracket no value put in Z[i]
      // This makes Z[i] and Z_plus[i] garbage
      printf("%d %lf %lf\n", i, Z[i], Z_plus[i]);   
    }

正确的代码将是

   while(count < n)
    {
      x1 = gasdev(&idum);
      x2 = gasdev(&idum);
      z  = sqrt(1-p*p)*x1 + p*x2 + mu;
      z_p= x2 + mu_plus;

      if (z > 2.17 || z<-2.17) 
       {
         // This allows count == n which overflows the buffer.
         count++;         
         Z[count]=z; 
         Z_plus[count]=z_p;
       }

    // This should be inside the bracket not outside
    printf("%d %lf\n",count, Z[count]);

    // This is not needed since it will exit the while at count == n
    if (count >n) break;
  }