rand()函数出错:for循环中的数字相同

时间:2017-10-13 23:09:46

标签: c

我的rand()函数有问题。我想随机生成eps值,彼此不同,i = 0,...,VOL。 但是,当我打印eps时,它总是一样的。 你能告诉我代码中的错误吗?谢谢。

GITHUB_PAT

代码的完整部分(复制整个代码是不可能的,因为它很长)是:

    ...
    #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);

            } 
    }
    }

和shuffle功能是:

#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;

        }

其他部分无关紧要。你可以想到&#39; a&#39;是常数,H_PR = 0.5,L_PR = 0.1 非常感谢。

3 个答案:

答案 0 :(得分:2)

你在循环内反复调用shuffle_signals()。每次访问此功能时,都会调用srand(),它会根据当前时间(自1970年以来的秒数)重置随机数生成器。您只应在程序中拨打srand()一次。靠近main()顶部的地方将是一个很好的地方。

答案 1 :(得分:1)

函数:shuffle_signals()是递归的,但是,函数:srand()只能在整个程序中调用一次。建议将呼叫转移到srand()函数的早期main()

答案 2 :(得分:0)

你可以这样做:

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;
}

unsigned int中添加srand(unsigned int(time(NULL)))时,没有任何内容影响随机值,因此您可以添加或保留结果即可。