我有一个随机函数,根据某些区间的可能性给出数字。
int myrand (float array[]){ //this function gives an interval according to
// possibilities
float possib[part];
int i;
float r;
possib[0]=array[3];
for (i=1;i<part;i++)
possib[i]=possib[i-1]+array[i+3];
r=(float)rand()/32767;
printf(" r= %f ",r); //this is to check whether r is different in every run
for(i=0;i<part;i++){
if(r<possib[i]){
return i;
break;
}
}
}
double myrandfinal(float array[],int n){ //this function gives a random
double final; //double in the chosen interval
final=array[n]+(((float)rand()/32767)*(array[n]-array[n-1]));
printf("final= %f",final-array[n]); //again to check
return final;
}
float eval() {
float l;
float interval[]={3.25,4.00,4.75,5.50};
float flar[]={0.1,0.25,0.15,0.5};
l=myrandfinal(interval,myrand(flar));
return 3+l;
}
在主要内容中我有以下内容:
int main(){
int i;
srand(time(NULL));
for(i=0;i<10;i++)
printf("%f",eval()); //the evaluate function
}
问题在于,当我期待像:
这样的光输出时6.50
7.25
7.60
...
我得到的输入如下:
6.50
6.50
6.50
...
虽然我在所有检查中得到不同的数字,但是evaluate函数的结果是相同的。在主要的时候,我刚刚写了
printf("%f",eval());
没有循环并执行自己几次,我得到不同的结果。会是什么原因?
对不起我的错,我是新用户,我正在努力习惯它:)
答案 0 :(得分:0)
超出界限UB
float eval() {
float flar[] = {0.1, 0.25, 0.15, 0.5};
// ...
... myrand(flar) ...
}
在被调用函数中,您尝试访问不存在的元素
int myrand (float array[]) {
// ...
for (i = 1; i < part; i++)
possib[i] = possib[i - 1] + array[i + 3];
// ^^^^^^^^^^^^
}
答案 1 :(得分:0)
由于我们没有看到所有相关代码,我们只能猜测。使用rand()
的计算产生常数值的两个原因是:
答案 2 :(得分:0)
代码在myrand()
代码稍后使用myrand(flar)
导致未定义的行为。
int myrand(float array[]) { //this function gives an interval according to possibilities
float possib[part];
int i;
float r;
possib[0] = array[3];
for (i = 1; i < part; i++)
possib[i] = possib[i - 1] + array[i + 3];
r = (float) rand() / 32767;
printf(" r= %f ", r); //this is to check whether r is different in every run
for (i = 0; i < part; i++) {
if (r < possib[i]) {
return i;
break;
}
}
// NO RETURN VALUE
}
答案 3 :(得分:0)
如果没有为线性同余PRNG(伪随机数生成器)正确播种,您将始终获得相同的值。 LCPRNG仅是简单的线性方程,定义为X(n + 1)=(X(n)* A + B)%C,其中A,B和C是常数(并且X(0)是种子)。
使用相同的参数调用srand()会将X(0)设置为相同的值... NOT调用srand()将每次使用默认的X(0)...
获取“随机”种子的一种方法是使用:
调用srand()srand(time(NULL));