繁体   English   中英

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

[英]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()产生常量的两个原因:

  • 重复调用具有相同参数的srand()
  • 整数运算,例如除法截断小数部分或(例如)始终产生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
}

如果您没有正确植入线性同余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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM