rand()在循环中给出相同的结果

时间:2017-05-09 09:12:02

标签: c random

我有一个随机函数,根据某些区间的可能性给出数字。

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());

没有循环并执行自己几次,我得到不同的结果。会是什么原因?

对不起我的错,我是新用户,我正在努力习惯它:)

4 个答案:

答案 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()的计算产生常数值的两个原因是:

  • 使用相同的参数重复调用srand()
  • 整数运算,例如截断小数部分或(例如)总是产生0。

答案 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));