随机三角形的面积
KeyTo9のFans 在百度数学吧里面提出:在以下图形的内部随机取三个点作为一个三角形的顶点,求这个三角形的面积的期望值。
在图形内部各处取点的概率是分布均匀的。
(1)边长为1的正方形
(2)边长为1的正三角形
(3)半径为1的圆 对任意凸区域D,假设其面积为S
对于任意一个方向$theta$,区域D在其垂直方向投影长度为$T(theta)$
我们可以将所有方向为$theta$的同区域D相交的直线用参数y表示其中$0<=y<=T(theta)$,记为直线$L(theta,y)$
假设直线$L(theta,y)$同D相交部分长度为$U(theta,y)$,它将区域D分成两部分,面积分布为$S_1(theta,y)$,$S_2(theta,y)$
两部分重心到$L(theta,y)$的距离分别为$H_1(theta,y)$,$H_2(theta,y)$
那么我推导的结果是最后三角形面积的期望为
$1/{12S^3}\int_0^{pi}d\theta\int_0^{T(\theta)}(S_1(\theta,y)*H_1(\theta,y)+S_2(\theta,y)*H_2(\theta,y))*U^4(\theta,y)dy$ 这应该属于积分几何的内容吧.. 这使我联想起ibm ponder this的一道题。
http://domino.research.ibm.com/Comm/wwwr_ponder.nsf/Challenges/October2006.html 呵呵,模拟一下么
正方形的好模拟
谁有兴趣
估计1000个点能得到很好的近似了吧? // ra.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <math.h>
#include <time.h>
#include <stdlib.h>
struct {double x, y;} a, b, c;
double area(void)
{
return ( (b.x - a.x) * (c.y - a.y) - (c.x - a.x) * (b.y - a.y) )/2.0;
}
#define RAND ((double)rand() / (double)RAND_MAX)
int _tmain(int argc, _TCHAR* argv[])
{
int i;
double s = 0.0;
srand((unsigned)time(NULL));
for (i = 0; i < 10000; i ++)
{
a.x = RAND;
a.y = RAND;
b.x = RAND;
b.y = RAND;
c.x = RAND;
c.y = RAND;
s += abs(area());
}
printf("随机值 = %.8f", s /10000.0);
return 0;
}
随机值 = 0.07646080 随机值 = 0.07694249
随机值 = 0.07645819
随机值 = 0.07722303 加大到1000000次
随机值 = 0.07644364
随机值 = 0.07643060
随机值 = 0.07645995 半径为1的圆预期应该比边长为1的正方形大 现在看来,有个好的随机函数库是很重要的
谁推荐个
页:
[1]
2