69,369
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int n = 8,s[8][8][8],i,II,j,k,k1,M1[50000],m=0;
double esum,esum1,esum2=0,e,e1,e2,e3=0,iseed,C1=0,E1[50000],t,m1=0;srand((unsigned)time(NULL));
int (*p)[8][8];
p = s;
for (i=0;i<=n-1;i++)
{
for(j=0;j<=n-1;j++)
{
for(k=0;k<=n-1;k++)
{
*(*(*(p+i)+j)+k)=1;
}
}
}
t=5;
for(k=0;k<15000;k++)
{
/****/
for(i=0;i<=n-1;i++)
{
for(j=0;j<=n-1;j++)
{
for(k=0;k<8;k++)
{
esum1 = 2*s[i][j][k]*(s[i][j][(k+1)&7]+s[i][j][(k-1)&7])/t;
if(k==0) esum2 = 0.5*s[i][j][0]*s[(i+1)&7][j][5]/t;
if(k==1) esum2 = 0.5*s[i][j][1]*s[(i+1)&7][j][4]/t;
if(k==2) esum2 = 0.5*s[i][j][2]*s[i][(j+1)&7][7]/t;
if(k==3) esum2 = 0.5*s[i][j][3]*s[i][(j+1)&7][6]/t;
if(k==4) esum2 = 0.5*s[i][j][4]*s[(i-1)&7][j][1]/t;
if(k==5) esum2 = 0.5*s[i][j][5]*s[(i-1)&7][j][0]/t;
if(k==6) esum2 = 0.5*s[i][j][6]*s[i][(j-1)&7][3]/t;
if(k==7) esum2 = 0.5*s[i][j][7]*s[i][(j-1)&7][2]/t;
esum = esum1 + esum2;
iseed=(rand()%10000)*0.0001;
if(iseed<=exp(esum))
{
s[i][j][k]=-s[i][j][k];
}
}
}
//****一次扫描/*
}
}
m = 0;
for(i=0;i<=n-1;i++)
{
for(j=0;j<=n-1;j++)
{
for(k=0;k<8;k++)
{
m=m+s[i][j][k];
}
}
}
esum = 0;
for(k1=0;k1<50000;k1++)
{
for(i=0;i<=n-1;i++)
{
for(j=0;j<=n-1;j++)
{
for(k=0;k<8;k++)
{
if(k==0) esum2 = 0.5*s[i][j][0]*s[(i+1)&7][j][5]/t,esum1 = 2*s[i][j][k]*(s[i][j][(k+1)&7]+s[i][j][(k-1)&7])/t,esum = esum1 + esum2;
if(k==1) esum2 = 0.5*s[i][j][1]*s[(i+1)&7][j][4]/t,esum1 = 2*s[i][j][k]*(s[i][j][(k+1)&7]+s[i][j][(k-1)&7])/t,esum = esum1 + esum2;
if(k==2) esum2 = 0.5*s[i][j][2]*s[i][(j+1)&7][7]/t,esum1 = 2*s[i][j][k]*(s[i][j][(k+1)&7]+s[i][j][(k-1)&7])/t,esum = esum1 + esum2;
if(k==3) esum2 = 0.5*s[i][j][3]*s[i][(j+1)&7][6]/t,esum1 = 2*s[i][j][k]*(s[i][j][(k+1)&7]+s[i][j][(k-1)&7])/t,esum = esum1 + esum2;
if(k==4) esum2 = 0.5*s[i][j][4]*s[(i-1)&7][j][1]/t,esum1 = 2*s[i][j][k]*(s[i][j][(k+1)&7]+s[i][j][(k-1)&7])/t,esum = esum1 + esum2;
if(k==5) esum2 = 0.5*s[i][j][5]*s[(i-1)&7][j][0]/t,esum1 = 2*s[i][j][k]*(s[i][j][(k+1)&7]+s[i][j][(k-1)&7])/t,esum = esum1 + esum2;
if(k==6) esum2 = 0.5*s[i][j][6]*s[i][(j-1)&7][3]/t,esum1 = 2*s[i][j][k]*(s[i][j][(k+1)&7]+s[i][j][(k-1)&7])/t,esum = esum1 + esum2;
if(k==7) esum2 = 0.5*s[i][j][7]*s[i][(j-1)&7][2]/t,esum1 = 2*s[i][j][k]*(s[i][j][(k+1)&7]+s[i][j][(k-1)&7])/t,esum = esum1 + esum2;
iseed=(rand()%10000)*0.0001;
if(iseed<=exp(esum))
{
s[i][j][k]=-s[i][j][k];
m = m + 2*s[i][j][k];
}
}
}
//****一次扫描/*
}
e=0;
e1=0;
e2=0;
for(i=0;i<=n-1;i++)
{
for(j=0;j<=n-1;j++)
{
e1 = -(s[i][j][1]*s[i][j][2] + s[i][j][2]*s[i][j][3] + s[i][j][3]*s[i][j][4] + s[i][j][4]*s[i][j][5] + s[i][j][5]*s[i][j][6] + s[i][j][6]*s[i][j][7] + s[i][j][7]*s[i][j][0]+ s[i][j][0]*s[i][j][1]);
e2 = -0.25*(s[i][j][0]*s[(i+1)&7][j][5]+s[i][j][1]*s[(i+1)&7][j][4]+s[i][j][2]*s[i][(j+1)&7][7]+s[i][j][3]*s[i][(j+1)&7][6]+s[i][j][4]*s[(i-1)&7][j][1]+s[i][j][5]*s[(i-1)&7][j][0]+s[i][j][6]*s[i][(j-1)&7][3]+s[i][j][7]*s[i][(j-1)&7][2]);
e = e1 + e2;
}
}
M1[k1] = abs(m/512);
E1[k1] = e;
}
for (k1=0;k1<50000;k1++)
{
e3 = e3 + E1[k1];
m1 = m1 + M1[k1];
C1 = C1 + (E1[k1]*E1[k1]);
}
e3 = e3/50000;
m1 = m1/50000;
C1 = (C1/50000 - e3*e3)/(t*t);
printf("%lf\n%lf\n%lf\n",C1,e3,m1);
}
for(k=0;k<15000;k++)//这地方是否有错误?
{
/****/
for(i=0;i<=n-1;i++)
{
for(j=0;j<=n-1;j++)
{
for(k=0;k<8;k++)
改成
for(k1=0;k1<15000;k1++)//这地方是否有错误?
{
/****/
for(i=0;i<=n-1;i++)
{
for(j=0;j<=n-1;j++)
{
for(k=0;k<8;k++)
只要6~7秒就可以了,应该可以更快