繁体   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