您的位置:首页 > 编程语言 > Go语言

pongo(英雄会)题解之理想随机数发生器

2013-11-27 21:15 197 查看
不得感慨下本科没好好学习概率论,这道题用概率论很简单。

首先还是题目:


题目详情:

一个理想随机数发生器R,给定参数正整数x,它可以均匀随机产生一个闭区间[0,x]之间的实数(注意是实数,每个实数出现的概率相同)R(x)。现在给定3个正整数a,b,c,我们使用a,b产生两个随机实数R(a), R(b),问R(a) + R(b) <= c的概率有多大?

输入: 正整数a,b,c。正整数均不超过10000

输出: R(a) + R(b) <= c的概率。注意输出是一个有理数(分数),请化为最简分数。(分子分母的最大公约数是1)。

例如 输入a = 1, b = 1, c = 4,输出"1/1"

这道题转换为概率论题目就是:x与y分别在[0,a]和[0,b]上服从均匀分布,并且x与y相互独立,求x+y<=z ,当z=c时的概率。

x与y分别在[0,a]和[0,b]上的概率密度为f(x)=1/a,f(y)=1/b;x与y相互独立,那么联合概率密度f(x,y)=1/(a*b) x属于[0,a]、y属于[0,b],

....

....

用图示如下(假如a>=b):



就是求阴影部分的面积与矩形面积的比例,分c<=b、b<c<=a、a<c<a+b和c>=a+b四种情况求,记得最后需要约去公约数,即结果中的分子与分母的最大公约数为1,代码如下:

#include <stdio.h>
#include <iostream>
#include <string>
#include<sstream>
using namespace std;
class Test {
public:
	static int maxG(int a,int b){
		while(b){
			int mid=b;
			b=a%b;
			a=mid;
		}
		return a;
	}
    static string calculate (int   a,int   b,int   c){
        if(c>=a+b)return "1/1";
		if(a<b){//for a>=b
				int mid =a;
				a=b;
				b=mid;
		}	
		int res=0;
		int sqr=2*a*b;
		if(c<=b){
			res=c*c;
		}else if(c>b&&c<=a){
			//res=c*c-(c-b)*(c-b);
			res=b*(2*c-b);
		}else {//a<c<a+b
			//res=2*a*b-(a+b-c)*(a+b-c);
			res=2*c*(a+b)-a*a-b*b-c*c;
		}
		int maxGYS=1;
		while((maxGYS=maxG(sqr,res))>1){
			res/=maxGYS;
			sqr/=maxGYS;
		}
		std::stringstream ss;
		ss<<res<<"/"<<sqr;
		std::string ret=ss.str();	
		return ret;
    }
};
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int main(){   
    cout<<Test::calculate(1,3,2)<<endl;   
} 
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: