阿里2017年-图形图像算法工程师-在线编程题目

阿里2017年-图形图像算法工程师-在线编程题目_第1张图片

这题是我今年写的在线编程题目,说一下我的思路:先通过正态分布随机函数求出X,Y点的集合,后将X,Y排列组合,得出不同坐标代入曲线方程,得出概率。

大家有不同思路,欢迎一起讨论。今年是研一,估计没什么进阿里的希望了,跟大家一起分享我的思路,欢迎探讨。

上代码::

#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

/**使用正太分布函数生成400个随机正太分布数,使得(X,Y)存在160000种组合情况,后求出符合要求的点。**/
double leartCurve(double mu1, double sigma1, double mu2, double sigma2)
{
	int k = 0;
	//default_random_engine generator;//如果用这个默认的引擎,每次生成的随机序列是相同的。
	random_device rd;
	mt19937 gen(rd());

	//normal(m1,s1)中m1为均值,s1为方差
	//生成正太分布的X,Y坐标。
	normal_distribution normal(mu1, sigma1);
	normal_distribution normal1(mu2, sigma2);
	double A[100] = { 0 };
	double B[100] = { 0 };
	int i = 0;

	for (int n = 0; n<10; n++)
	{
		for (int j = 0; j<10; j++)
//生成正太分布坐标,放在数组中
		{
			A[i] = ( normal(gen));
			B[i] = ( normal1(gen));
			i++;
		}
	}
	for (int i = 0; i < 100; i++)
	{
		for (int j = 0; j < 100; j++)
		{
//将不同坐标代入该曲线方程,得出是否在曲线内
			double R = ((((A[i] * A[i]) + (B[j] * B[j]) - 1)*((A[i] * A[i]) + (B[j] * B[j]) - 1)) - (A[i] * A[i] * B[j] * B[j]));
			if (R <= 0)
				k++;
		}
	}
	double result = k / 10000.0;

	return result;
}
//主函数 得出结果
int main() {
	double res;

	double _mu1;
	cin >> _mu1;
	cin.ignore(std::numeric_limits::max(), '\n');

	double _sigma1;
	cin >> _sigma1;
	cin.ignore(std::numeric_limits::max(), '\n');

	double _mu2;
	cin >> _mu2;
	cin.ignore(std::numeric_limits::max(), '\n');

	double _sigma2;
	cin >> _sigma2;
	cin.ignore(std::numeric_limits::max(), '\n');


	res = leartCurve(_mu1, _sigma1, _mu2, _sigma2);
	cout << fixed << setprecision(1) << res << endl;

	return 0;

}


你可能感兴趣的:(阿里在线编程测验)