簡體   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