簡體   English   中英

rand()函數出錯:相同的數字進入for循環

[英]Error with rand() function: same numbers into a for loop

我的rand()函數有問題。 我想隨機生成eps值,對於i = 0,...,VOL彼此不同。 但是,當我打印eps時,它總是一樣的。 您能告訴我代碼中的錯誤嗎? 謝謝。

    ...
    #include <time.h>
    ...

    void function(...);

    int main(){

    function();

    return 0;
    }

    void function(...){

    srand((unsigned int)time(NULL));
    ...

    for(i=0;i<VOL;i++){

            signal1[i]=0.; // No signal

            eps=rand()/(RAND_MAX+0.5);

            if(signal1[i]==(MIN+MAX)){ 

                net[i]= 0; 

                exp[i]=a+eps; 
                printf("eps: %f\n", eps);

            } 
    }
    }

代碼的完整部分(因為很長,因此無法復制整個代碼)是:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

#define VOL 15

#define MAX 10
#define MIN 0

float random_sign_high[VOL]={2,2,2,2,2,2,2,2,2,1,1,1,1,1,0};
float random_sign_low[VOL]={2,2,2,2,2,2,2,2,1,1,1,1,1,0,0};

void function();

int main(){

function();

return 0;
}

void function(){
...
srand((unsigned int)time(NULL));

for(i=0;i<VOL;i++){

        signal1[i]=0.; // No signal
        signal2[i]=0.; // No signal


        if(H_PR!=0){
             shuffle_signals(random_sign_high);
        }

        if(L_PR!=0){
            shuffle_signals(random_sign_low);
        }

        eps=rand()/(RAND_MAX+0.5);
        printf("eps: %f\n", eps);

        if(tot_sig==(MIN+MAX)){

            net[i]= 0;

            exp_p[i]=a+eps;

        }

隨機播放功能是:

double shuffle_signals(float array[VOL])

{
    srand((unsigned int) time(NULL));

    if(VOL>1)
    {
        int i,j,t;
        for(i=0; i<VOL;i++)
        {
            j=i+rand()/((float)RAND_MAX/(VOL-i)+1.);
            t=array[j];
            array[j]=array[i];
            array[i]=t;

            if(array[i]==1){
                signal2[i]=MIN;
                signal1[i]=MAX;
            }
            else if(array[i]==0){
                signal2[i]=MIN;
                signal1[i]=MIN;
            }
            else if (array[i]==2){
                signal1[i]=MAX;
                signal2[i]=MAX;
            }
            tot_sig= signal1[i]+signal2[i];
        }
        // printf("tot_sign: %lf\n", tot_sig);
    }
    return tot_sig;
}

}

其他部分無關緊要。 您可以認為'a'是一個常數,H_PR = 0.5和L_PR = 0.1非常感謝。

您正在從循環內部重復調用shuffle_signals() 每次訪問此函數時,都調用srand() ,它會根據當前時間(自1970年以來的秒數)重置隨機數生成器。 您僅應在程序中調用srand()一次。 main()頂部附近的某個位置是個不錯的選擇。

函數: shuffle_signals()是遞歸的,但是,函數: srand()在整個程序中應僅被調用一次。 建議將對srand()的調用移到main()函數的早期。

您可以這樣做:

int main ()
{
    int x;
    x = rand() % 100; // here you got always the same value
    printf ("Our first number: %d\n", x);
    srand ( time(NULL) ); // from now on you'll get random values
    x = rand() % 100;
    printf ("Some random number: %d\n", x);
    x = rand() % 100;
    printf ("The first number again: %d\n", x);

    return 0;
}

srand(unsigned int(time(NULL)))中添加unsigned int時,不會影響隨機值,因此您可以添加它,也可以保留結果就可以了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM