这题是我今年写的在线编程题目,说一下我的思路:先通过正态分布随机函数求出X,Y点的集合,后将X,Y排列组合,得出不同坐标代入曲线方程,得出概率。
大家有不同思路,欢迎一起讨论。今年是研一,估计没什么进阿里的希望了,跟大家一起分享我的思路,欢迎探讨。
上代码::
#include <iostream>
#include <vector>
#include <numeric>
#include <limits>
#include <random>
#include <iomanip>
#include <math.h>
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<double> normal(mu1, sigma1);
normal_distribution<double> 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<std::streamsize>::max(), '\n');
double _sigma1;
cin >> _sigma1;
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
double _mu2;
cin >> _mu2;
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
double _sigma2;
cin >> _sigma2;
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
res = leartCurve(_mu1, _sigma1, _mu2, _sigma2);
cout << fixed << setprecision(1) << res << endl;
return 0;
}