[英]rand() give the same result in loop
我有一个随机函数,它根据一些间隔的可能性给出数字。
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
...
尽管我在所有检查中得到的数字都不相同,但是评估函数的结果是相同的。 我写的时候主要
printf("%f",eval());
没有循环,执行自己几次,我得到不同的结果。 请问是什么原因?
对不起,我的错,我是新用户,我想习惯它:)
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];
// ^^^^^^^^^^^^
}
由于我们看不到所有相关代码,因此只能猜测。 rand()
产生常量的两个原因:
代码在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
}
如果您没有正确植入线性同余PRNG(伪随机数生成器),则将始终获得相同的值。 LCPRNG只是一个简单的线性方程,定义为X(n + 1)=(X(n)* A + B)%C,其中A,B和C是常数(而X(0)是种子)。
使用相同的参数调用srand()会将X(0)设置为相同的值...不调用srand()每次都会使用默认的X(0)...
获得“随机”种子的一种方法是使用以下命令调用srand():
srand(time(NULL));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.