最近几天遇到了三道随机化打表找规律的题,所以记录一下,学一学套路
1.Random Point in Triangle
给你一个三角形,在里面随机取一个点,问其中那个点与三角形两个顶点所构成的三角形面积最大的期望值
2.Eddy Walker
有一个圈,你从0开始出发,每次可能向前或者向后走一步,问你走完一圈后停在某个点的概率
3.Expected Size of Random Convex Hull
给你一个三角形,在里面随机取N个点,问这个N个点有多少个点在凸包的期望
这些题都有一个特点就是求概率或期望,但不是通常的概率dp,硬推会非常难受,所以我们可以利用随机数生成来完成随机取点打表,需要注意的是我们打表的时候数据要足够随机,数据量要绝对大,这样所打出来的表才会较靠近答案,这样才容易找出正确的规律
1.例如第一题,我们可以造一个很大的三角形,然后随机取点多次取平均,找出规律为 11 ∗ S 11*S 11∗S
2.第二题,我们取随机数判奇进偶退模拟过程,找出到达所有点的概率都相同
3.第三题,我们可以造一个很大的三角形,然后随机取点,建立凸包,重复多次取平均,找到规律
但是需要注意的是有时候我们打表找出来的数只是一个接近正解的答案,但是与正解有精度误差,我们可以打出分数表看哪个分数接近打表所得到的数
两个常用随机数函数
mt19937 mrand(time(0) : 这个比较随机,随机数据也大
srand(time(0)) : 这个随机数据范围在32766之内
第三题打表程序
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const double eps=1e-8;
int sgn(double x)
{
if(fabs(x)<=0)
return 0;
if(x<eps)
return -1;
return 1;
}
struct Point
{
double x,y;
Point(double _x=0,double _y=0)
{
x=_x