⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tiji.cpp

📁 用投石法来计算多维球体的体积
💻 CPP
字号:
#include<stdio.h>
#include<math.h>


int I[101][10]; //用于存放递推得到的余数,前一个指标表示维数
double w[101];	  //用于存放当前产生的随机点的各维坐标
int N;            //表示总维数
int a=16807,r=2836;
long int m=2147483647,q=127773;
int N0=10000000;	  //投石总数,一千万个点,为保证精度在1%内
int N1=0;		 //N维球内点的总数 
double V0;	     //N维正方体体积
double V;		 //N维单位球体积
main()
{double distance(int k);
 int rand(int z);
 int i,j;

 printf("输入总维数\n");
 scanf("%d",&N);
 printf("维数为:%d\n",N);
 printf("输入各维的随机数种子(正整数)\n");
 for(i=1;i<=N;i++)
	{
	 printf("第%d维种子:",i);
	 scanf("%d",&I[i][0]);
	 printf("\n");
	}
 
 
 
 for(i=1;i<=N0;i++)//投石的个数(每个石子实际包括d个随机数,即d维座标)
	{
		for(j=1;j<=N;j++)//j表示维数
		{
		 I[j][1]=rand(I[j][0]);
		 w[j]=2*(double(I[j][1])/double(m))-1;//产生随机数
		}
		
	 
	 if(distance(N)<1) N1++;
	 for(j=1;j<=N;j++)
		{
		 I[j][0]=I[j][1];
		}
 
	}

 V0=1.0;
 for(i=1;i<=N;i++)
	{V0=2*V0;}
 printf("N1=%d\n",N1);
 printf("V0=%f\n",V0);
 V=V0*(double(N1)/double(N0));
 printf("V=%f\n",V);
}


double distance(int k)
{
 double D=0;
 int i;
 for(i=1;i<=k;i++) 
 {D=D+w[i]*w[i];}
 return D;
}

int rand(int z)
{int I,s;
 s=a*(z%q)-r*(z/q);
 if(s>=0) I=s;
 else I=s+m;
 return I;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -