C 为什么我的随机数生成器只生成随机数?
我正在使用蒙特卡罗算法编写一个伊辛模型。为什么我的随机数生成器只生成一个随机数 a和b的值未按预期变化。即使随机数生成器是伪随机的,数字也不会像实际情况那样发生变化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;
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次交互,第二个时间步可能会改变。