Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么我的随机数生成器只生成随机数?_C_Montecarlo - Fatal编程技术网

C 为什么我的随机数生成器只生成随机数?

C 为什么我的随机数生成器只生成随机数?,c,montecarlo,C,Montecarlo,我正在使用蒙特卡罗算法编写一个伊辛模型。为什么我的随机数生成器只生成一个随机数 a和b的值未按预期变化。即使随机数生成器是伪随机的,数字也不会像实际情况那样发生变化 for(mc=0;mc<=mcs;mc++) { srand(time(NULL)); for(i=0;i<N;i++) { a=rand()%N; for(j=0;j<N;j++) { b=rand()%N;

我正在使用蒙特卡罗算法编写一个伊辛模型。为什么我的随机数生成器只生成一个随机数

a和b的值未按预期变化。即使随机数生成器是伪随机的,数字也不会像实际情况那样发生变化

for(mc=0;mc<=mcs;mc++)
{
    srand(time(NULL));
    for(i=0;i<N;i++)
    {
        a=rand()%N;

        for(j=0;j<N;j++)
        {
            b=rand()%N;

            for(l=0;l<=3;l++)
            {
                c= a+(l-1)*(1.0*(1+pow(-1,l))/2.0);
                d= b+(l-2)*(1.0*(1-pow(-1,l))/2.0);

                if(c==-1)
                {
                    L[c][d]=L[N-2][d];
                }
                if(c==N)
                {
                    L[c][d]=L[1][d];
                }
                if(d==-1)
                {
                    L[c][d]=L[c][N-2];
                }
                if(d==N)
                {
                    L[c][d]=L[c][1];
                }

                if(L[a][b]*L[c][d]==1)
                {
                    n1= n1+1; //like spins
                }
            }

            n0= 4-n1; //unlike spins

            dE= n1-n0;

            if(dE<=0)
            {
                if(L[a][b]== 1)
                {
                    L[a][b]= -1;

                }
                else
                {
                    L[a][b]= 1;
                }

            }
            else
            {
                if(dE>0)
                {
                    prob= exp(-dE/(kT));
                    srand(time(NULL));
                    r= (float)rand()/RAND_MAX;

                    if(r<=prob)
                    {
                        if(L[a][b]== 1)
                        {
                            L[a][b]= -1;

                        }
                        else
                        {
                            L[a][b]= 1;
                        }

                    }
                    else
                    {
                        if(L[a][b]== 1)
                        {
                            L[a][b]= 1;

                        }
                        else
                        {
                            L[a][b]= -1;

                        }
                    }

                }
            }
        }
    }
}
移动srandtimeNULL;在for循环之前。正如StoryTeller和chux所指出的那样,现在的情况是,如果对srand的调用是在同一秒完成的,那么for的每次迭代都会得到相同的数字。
在循环之前只播一次种子,这个问题应该得到解决

为了让问题更清楚:随机数在mc迭代之间没有变化吗?你为什么大喊大叫?是的,随机数在mc迭代之间没有变化。一些波兰语:只要在大多数机器上循环发生在不到一秒钟的时间内,你就会得到相同的数,所以timeNULL只会继续为种子返回相同的值。@StoryTeller稍微润色一下。获得相同的数字,只要循环在相同的第二个时间步内发生,并且只有2次交互,第二个时间步可能会改变。