#include <iostream>
#include<stdlib.h>
using namespace std;
#define LOOP 10000
int main()
{
int rgnC=0;
for(int i=0; i<LOOP; i++)
{
int x=rand();
int y=rand();
if(x*x+y*y<RAND_MAX*RAND_MAX)
rgnC++;
}
printf("%d\n", rgnC);
system("pause");
return 0;
}
以下是我解答思路和该书作者对题的解答,我设置成白色了,大家可以选中察看
首先防止平方造成差异,对式子变形
x*x+y*y+2xy <RAND_MAX*RAND_MAX+2xy
x+y <RAND_MAX*RAND
将范围大概分为1-10段,1-2.5 2.5-5 5.5-7 7.5-10,当然越细越准
要求即x+y都在段5以下即可,那问题就简单了,判断下在各个区域出现的概率,比如x,y都出现在1-2.5区域的概率,以此类推,这里就不细说了。
最后得到结果大概为780左右。
该书作者是这样解的,其实RAND_MAX*RAND_MAX是4分之1圆,x*x+y*y其实是表示一个正方形的面积,求的就是圆和正方形面积之比。图画不出来,网上应该可以找得到
圆面积为 (1/4)PAI*R*R
正方形 R*R
比为1/4*pai
即LOOP*1/4*pai=250pai.
结果也是785左右。
有个不解,为什么RAND_MAX*RAND_MAX是表示4分之1圆