有人可以帮助我查看我在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;
}
它可以正常打印,但最后会出错。
谢谢!
答案 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;
}