📄 random.cpp
字号:
#include<iostream.h>
#include<stdio.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>
#define N 1000
int edge[N][N];
double SumDegree=0; //总度数
int degree[N]; //各点度
double result[2][N/2];
void SaveTo(int);
int quan[N];
int total;
/*---------------------按照幂律分布加权--------------------------*/
void AddPower(int n)
{
int i,j,k=1;
double t=1.0,a[10],Rand;
for(i=1;i<10;i++)
{
t+=pow(t+i,-3.0);
}
for(i=0;i<10;i++)
a[i]=(pow(1.0+i,-3.0))/t;
Rand=(double)rand()/RAND_MAX;
t=a[0];
// for(i=0;i<10;i++)cout<<a[i]<<endl;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
{
if(edge[i][j]==1)
{
while(Rand>t)
t+=a[k++];
edge[j][i]=edge[i][j]=k;
k=1;
Rand=(double)rand()/RAND_MAX;
t=a[0];
}
}
}
/*-----------------生成规则网时判断有无边函数----------------------*/
int det(int i,int j,int n)
{
if(i-j>=-2&&i-j<=2&&i-j!=0)return 1;
else if(i-j>2)
{
if(n-(i-j)<=2)return 1;
else return 0;
}
else if(i-j<-2)
{
if((n+i-j)<=2)return 1;
else return 0;
}
return 0;
}
/*--------------------统计各点的度-----------------*/
void EveryDegree(int n)
{
int i,j,t=0;
SumDegree=0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
t+=edge[i][j];
degree[i]=t;
SumDegree+=t;
t=0;
}
}
/*-----------由小到大排列度和节点度重---------*/
void sort(int *ge,int t,int n) //total总点数
{
int i,j,k;
total=t;
for(i=0;i<total-1;i++)
for(j=i+1;j<total;j++)
if(ge[i]==ge[j])
{
for(k=j;k<total-1;k++)
ge[k]=ge[k+1];
total--;
j--;
}
for(i=0;i<total-1;i++)
for(j=0;j<total-i-1;j++)
if(ge[j]>ge[j+1])
{
k=ge[j];
ge[j]=ge[j+1];
ge[j+1]=k;
}
for(i=0;i<total;i++)
{
result[0][i]=ge[i];
double t=0.0;
for(j=0;j<n;j++)
if(ge[i]==degree[j])t++;
result[1][i]=t/n;
}
}
void Ra(int i,int n)
{
int rad=(int)rand()%2+1,lay=0;//rad记录挪动i行的哪条边
lay=(int)rand()%n;
while(lay==i||edge[i][lay]==1)
lay=(int)rand()%n; //随机确定挪动边将放的位置
if(i<n-2)
{
while(edge[i][i+rad]==0)
{
rad=(int)rand()%2+1;
}
edge[i][i+rad]=0;
edge[i+rad][i]=0;
edge[i][lay]=1;
edge[lay][i]=1;
}
else
if(i==n-2)
{
if(rad==1&&edge[i][i+rad]==1)
{
edge[i][i+rad]=0;
edge[i+rad][i]=0;
edge[i][lay]=1;
edge[lay][i]=1;
}
else
if(rad==1&&edge[i][i+rad]==0)
{
while(lay==1||edge[1][lay]==1)
lay=(int)rand()%n;
edge[1][n-1]=0;
edge[n-1][1]=0;
edge[1][lay]=1;
edge[lay][1]=1;
}
else
if(rad==2&&edge[1][n-1]==1)
{
while(lay==1||edge[1][lay]==1)
lay=(int)rand()%n;
edge[1][n-1]=0;
edge[n-1][1]=0;
edge[1][lay]=1;
edge[lay][1]=1;
}
else
{
edge[i][i+1]=0;
edge[i+1][i]=0;
edge[i][lay]=0;
edge[lay][i]=0;
}
}
else
{
while(edge[0][lay]==1)
lay=(int)rand()%n;
while(edge[0][n-rad]==0)
rad=(int)rand%2;
edge[0][n-rad]=0;
edge[n-rad][0]=0;
edge[0][lay]=1;
edge[lay][0]=1;
}
}
/*-------------------------保存到文件-----------------------*/
/*void SaveTo(int total)
{
FILE *fp;
fp=fopen("Rdat1.txt","w");
fprintf(fp,"序号 节点的度 节点度重\n ");
for(int i=0;i<total;i++)
fprintf(fp,"%-10d%-10lf%10lf\n ",i+1,result[0][i],result[1][i]);
fclose(fp);
}
*/
void main()
{
int n=1000,i,j,lines,m,*ge,k=0;
FILE *fp;
char ch1[]="oldBA0.txt",ch2[]="newBA0.txt",ch3[]="Radat0.txt";
double p;
srand( (unsigned)time(NULL) );
//cout<<"请输入节点个数:";
//cin>>n;
cout<<"请输入p的值:"<<endl;
cin>>p;
clock_t start,finish;
start=clock();
////////////////////////////////////////////////////////////
while(k<10)
{
ch1[5]='0'+k;
ch2[5]='0'+k;
ch3[5]='0'+k;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(det(i,j,n))
edge[i][j]=1;
else edge[i][j]=0;
}
lines=n*2;
int changelines=int(p*lines);
while(changelines>=n)
{
for(i=0;i<n;i++)
{
Ra(i,n);
}
changelines-=n;
}
m=(int)rand()%(n-changelines); //随机确定最后小于n的点的随机取点范围
for(i=m;i<m+changelines;i++)
{
Ra(i,n);
}
EveryDegree(n);//求各点度
ge=new int[n];
for(i=0;i<n;i++)
ge[i]=degree[i];
sort(ge,n,n); //排序节点度重
/* for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
cout<<edge[i][j]<<" ";
cout<<endl;
}
for(i=0;i<n;i++)
cout<<degree[i]<<endl;*/
/*-----------------------把原矩阵存入文件------------------------------*/
fp=fopen(ch1,"w");
fprintf(fp,"%-6d",n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(i==j)fprintf(fp,"%4d",degree[i]);
else
fprintf(fp,"%4d",edge[i][j]);
}
fclose(fp);
/*--------------------------结矩阵加权------------------------------------*/
AddPower(n);
/*--------------------------把加权矩阵存入文件------------------------------------*/
for(i=0;i<n;i++)
{
quan[i]=0;
for(j=0;j<n;j++)
quan[i]+=edge[i][j];
}
fp=fopen(ch2,"w");
fprintf(fp,"%-6d",n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(i==j)fprintf(fp,"%4d",quan[i]);
else
fprintf(fp,"%4d",edge[i][j]);
}
fclose(fp);
/*------------------节点度重信息存入文件-------------------------------------------*/
fp=fopen(ch3,"w");
fprintf(fp,"序号 节点的度 节点度重\n ");
for(int i=0;i<total;i++)
fprintf(fp,"%-10d%-10lf%10lf\n ",i+1,result[0][i],result[1][i]);
fclose(fp);
int ji=(1+k)*10;
cout<<"已经完成"<<ji<<"%..."<<endl;
k++;
}
finish=clock();
double Time=double(finish-start)/1000;
cout<<"程序运行完毕用的时间为"<<Time<<"秒!"<<endl;
//cout<<"按回车键退出!"<<endl;
//char ch=getchar();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -