Random Point in Triangle【随机数解决期望值问题】
Random Point in Triangle
题目描述
Bobo has a triangle ABC with A(x1,y1),B(x2,y2)A(x1,y1),B(x2,y2) and C(x3,y3)C(x3,y3). Picking a point P uniformly in triangle ABC, he wants to know the expectation value E=max{SPAB,SPBC,SPCA}E=max{SPAB,SPBC,SPCA} where SXYZSXYZ denotes the area of triangle XYZ.
Print the value of 36×E36×E. It can be proved that it is always an integer.
输入描述:
The input consists of several test cases and is terminated by end-of-file.
Each test case contains six integers x1,y1,x2,y2,x3,y3x1,y1,x2,y2,x3,y3.
* |x1|,|y1|,|x2|,|y2|,|x3|,|y3|≤108|x1|,|y1|,|x2|,|y2|,|x3|,|y3|≤108
* There are at most 105105 test cases.
输出描述:
For each test case, print an integer which denotes the result.
输入
0 0 1 1 2 2
0 0 0 0 1 1
0 0 0 0 0 0
输出
0
0
0
题目描述:
多组输入三角形各个顶点坐标p1,p2,p3,在三角形中任取一点p,计算 期望E=max(S(p,p1,p2),max(S(p,p1,p3),S(p,p2,p3)));
思路:
1、产生随机点,选出在三角形内部的点,对每个符合条件的点分别求出最大面积并求和,最后取面积和的平均值即为期望E。 (当随机数足够多时,所有最大面积和的平均值即为期望)
2、根据下面找规律代码可以求出:(由于是跑的随机数,结果定不完全等于22)

3、求出E后可以看出规律,即 36*E=22*S(p1,p2,p3)
补充:
1、根据三角形坐标求三角形面积:向量差乘求三角形面积
2、坐标点结构体:
struct poLL{
LL x;
LL y;
};
struct poLL p1,p2,p3,p;
p1.x=x1,p1.y=y1;
p2.x=x2,p2.y=y2;
p3.x=x3,p3.y=y3;
一看就能看懂,挺好用的,在传点坐标时不用分别传x、y了
找规律代码:
#include<bits/stdc++.h>
using namespace std;
struct point{
double x;
double y;
};
double S(point p1,point p2,point p3) ///向量叉乘求三角形面积可以看上面链接
{
return fabs((p1.x-p3.x)*(p1.y-p2.y)-(p1.x-p2.x)*(p1.y-p3.y));
}
bool judge(point p,point p1,point p2,point p3) ///判断生成的随机点是不是在三角中 原理是:三个
///小三角形面积之和是不是等于原来大的三角形面积
{
if(S(p1,p2,p3)==(S(p1,p2,p)+S(p,p1,p3)+S(p2,p3,p))){
//printf("*%lf %lf %lf %lf\n",S(p1,p2,p3),S(p1,p2,p),S(p,p1,p3),S(p2,p3,p));
return true;
}
return false;
}
int main()
{
double x1,x2,x3,y1,y2,y3;
while(scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3)!=EOF){
double cnt=0;
struct point p1,p2,p3,p;
p1.x=x1,p1.y=y1;
p2.x=x2,p2.y=y2;
p3.x=x3,p3.y=y3;
srand(time(0));
double sum=0;
for(int i=0;i<100000000;i++){
int x=rand();
int y=rand();
p.x=x*1.0,p.y=y*1.0;
if(judge(p,p1,p2,p3)){
cnt++;
sum+=(max(S(p1,p2,p),max(S(p,p1,p3),S(p2,p3,p))));
}
//printf("%.3lf\n",sum);
}
double S1=S(p1,p2,p3);
double q=((sum/cnt)*36.0)/S1;
printf("%.3lf\n",q);
}
return 0;
}
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
struct poLL{
LL x;
LL y;
};
LL S(poLL p1,poLL p2,poLL p3)
{
return abs((p1.x-p3.x)*(p1.y-p2.y)-(p1.x-p2.x)*(p1.y-p3.y));
}
int main()
{
LL x1,x2,x3,y1,y2,y3;
while(scanf("%lld%lld%lld%lld%lld%lld",&x1,&y1,&x2,&y2,&x3,&y3)!=EOF){
struct poLL p1,p2,p3,p;
p1.x=x1,p1.y=y1;
p2.x=x2,p2.y=y2;
p3.x=x3,p3.y=y3;
printf("%lld\n",11*S(p1,p2,p3));
}
return 0;
}
Random Point in Triangle【随机数解决期望值问题】的更多相关文章
- python random模块(获取随机数)的常用方法及示例
random.randomrandom.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0 random.uniformrandom.uniform(a, b),用 ...
- C#在循环中使用Random时生成的随机数相同的解决办法
场景 在循环中使用 Random y = new Random(); 生成随机数时每次循环生成的数是一样的. ; i < ;i++ ) { Random y = new Random(); Po ...
- [转载]C# Random 生成不重复随机数
Random 类 命名空间:System 表示伪随机数生成器,一种能够产生满足某些随机性统计要求的数字序列的设备. 伪随机数是以相同的概率从一组有限的数字中选取的.所选数字并不具有完全的随机性,因为它 ...
- Random快速产生相同随机数的原因及解决方案
老生常谈,还是那三句话: 学历代表你的过去,能力代表你的现在,学习代表你的将来 十年河东,十年河西,莫欺少年穷 学无止境,精益求精 问题描述:很多时候我们可能需要在极短的时间内生成大量的随机数,但是你 ...
- C# Random 生成不重复随机数
命名空间:System 表示伪随机数生成器,一种能够产生满足某些随机性统计要求的数字序列的设备. 伪随机数是以相同的概率从一组有限的数字中选取的.所选数字并不具有完全的随机性,因为它们是用一种确定的数 ...
- js 生成随机数解决缓存的问题
对于缓存有一个解决方法是在链接后添加随机数 例如登陆后跳转到链接/home,但是有缓存上次用户的登陆名,于是在/home后面加上一个随机数 var href = '/home?'+Math.rando ...
- C#Random随机值重复的解决方法
使用如上图所示的代码,将会出现如下情况,明明是随机,可值都是同样的,这样的随机几率也太小了,所以估计是代码有问题. 于是搜索了下,发现引起这个问题的原因是C#中的Random是根据时间来产生随机数,而 ...
- 使用RandomString方法后,结果返回相同的随机数解决办法
所遇问题: 在做超市管理系统的登录项目时,在对“随机数的产生”出现一个问题,在产生多个随机数的时候,出现了产生了多个一样的随机数,具体代码如下: /// <summary> /// 生成随 ...
- 在使用Math.random()生成6位随机数遇到的问题,并成功得到6位随机数
最近在做卫生局的一个考务网时需要实现一个短信发送验证码的功能,因此就必须使用到随机生成6位验证码的功能,开始觉的简单的,随便写了个 +); String messageCode = String.va ...
随机推荐
- python字典详细介绍
字典的用途 字典是Python提供的一种常用的数据结构,它用于存放具有映射关系的数据. 字典相当于保存了两组数据,其中一组数据是关键数据,被称为 key:另一组数据可通过 key 来访问,被称为 ...
- Android设置按钮透明
<Button android:id="@+id/bt3" android:layout_width="163dp" android:layout_hei ...
- NO.2 TI开发环境的搭建 SDK+Code Composer Studio
首先我们要了解TI嵌入式开发环境 对于TI嵌入式开发,首先我们要下载SDK软件包,其次要准备编译环境Code Composer Studio. 对于SDK的下载,可以在官网浏览http://www.t ...
- 解码问题--leetcode:91 (2019商汤笔试)
题目:有一种将字母编码成数字的方式:'a'->1, 'b->2', ... , 'z->26'. 现在给一串数字,给出有多少种可能的译码结果. 想法: 该题就是动态规划问题,建议在写 ...
- vue-cli3区分开发和生产环境
vue-cli3出来很久了,之前一直使用vue-cli2的配置,并且区分了生产和开发环境,自己的理解,环境分两大类,开发环境 和生产环境,最近升级到了vue-cli4当然改动并不大. 升级的主要原因嘛 ...
- CF652E Pursuit For Aritifacts
题目传送门 这是一道很好的练习强联通的题目. 首先,从题中可以看到,题目的要求就是要我们求出从起点到终点是否可以经过flag = 1 的边. 由于是无向图,且要求很多,直接暴力dfs会很凌乱. 那么, ...
- PowerShell读写文件,行的去重
Power Shell类似bash终端能够直接操作文件,使用其内置的Get-Content函数,配合一定的参数,能方便地读取文件和重定向. 1. Power Shell>>Get-Cont ...
- Web-从Java Request对象到HTTP协议
https://mp.weixin.qq.com/s/PjcA22STEDGwRxVQweObQQ Java Web中的Request对象是哪里来的?Response对象的角色是什么? Java We ...
- Nginx 笔记(三)nginx 配置实例 - 反向代理、负载均衡、动静分离
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.反向代理 反向代理准备工作: (1)在 liunx 系统安装 tomcat,使用默认端口 8080 ...
- Java实现 LeetCode 784 字母大小写全排列(DFS)
784. 字母大小写全排列 给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串.返回所有可能得到的字符串集合. 示例: 输入: S = "a1b2" ...