谢谢各位的回答。
此题我已经解决了。
问题是我提议没理解清楚,估计还误导大家了。
蒲丰投针的平行线是一组的,我以为是2条。呵呵。
那么这样的话相交条件改一下,就行了。
下面是我的程序,有兴趣的朋友可以看看。
/*:“在平面上画有一组间距为d的平行线,将一根长度为l(l
求此针与平行线中任一条相交的概率”蒲丰本人证明了,这个概率是=2l/(πd) ,π为圆周率 */
#include
#include
#include
#include
#include
#include
#define N 10000 /*N表示总的投掷次数*/
#define TIME 5 /*做TIME次这样的实验,来平均求pi*/
int main(void)
{
int gdriver = DETECT, gmode, errorcode;
int xmax, ymax;
int x1,x2,y1,y2,i,j;
int counter = 0;
int l = 15,d = 70;
double pi = 0.0,p = 0.0,sum = 0.0;
initgraph(&gdriver, &gmode, "");
errorcode = graphresult();
srand((unsigned)time(NULL));
if (errorcode != grOk)
{
printf("Graphics error: %s\n",
grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
xmax = getmaxx();
ymax = getmaxy();
for(j=0;j
{
setcolor(WHITE);
/* draw a diagonal line */
for(i=0;i<=ymax;i=i+d)
{
line(0, 0+i, xmax, 0+i); /*平行线d=70*/
}
setcolor(RED);
for(i=0;i
{
x1 = rand()%(xmax+1); /*从0到xmax随机一点*/
y1 = rand()%(ymax+1);
do
{
x2 = rand()%(x1+l)+x1-l; /*从x1 +- l的范围中随机出一点x2,因为当x2偏离x1超过1个l后,就不可能有长度为l的线段产生*/
}while(x2>x1+l);
y2 = sqrt(l*l - (x2-x1)*(x2-x1))+y1; /*算出点y,限制条件为长度为l*/
line(x1,y1,x2,y2);
if(y1/d!=y2/d) /*相交条件*/
{
counter++;
}
}
printf("intersected lines are:%d\n",counter);
p = (double)counter/N;
printf("the probability is :%lf\n",p) ;
pi = (double)2*l/(p*d);
printf("The 'pi' is :%lf",pi);
printf("press any key to clear\n");
counter =0;
sum +=pi;
getchar();
system("cls");
}
printf("The average pi is : %lf",sum/TIME);
getch();
closegraph();
return 0;
}