147 lines
5.0 KiB
C#
147 lines
5.0 KiB
C#
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
|
||
//
|
||
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
|
||
//
|
||
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
|
||
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
|
||
namespace Admin.NET.Core.Util;
|
||
public class MajorPlanscoreTool
|
||
{
|
||
|
||
|
||
|
||
|
||
// 计算标准差
|
||
private static double CalculateStandardDeviation(int[] values)
|
||
{
|
||
double average = values.Average();
|
||
double sumOfSquares = values.Sum(val => Math.Pow(val - average, 2));
|
||
return Math.Sqrt(sumOfSquares / values.Length);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 正态分布计算
|
||
/// </summary>
|
||
/// <param name="scorelist"></param>
|
||
/// <param name="requestScore"></param>
|
||
/// <returns></returns>
|
||
public static string CalctPercentage(List<int> scorelist, int requestScore)
|
||
{
|
||
var scores = scorelist.ToArray();
|
||
|
||
// 计算平均值和标准差
|
||
double average = scores.Average();
|
||
double stdDev = CalculateStandardDeviation(scores);
|
||
|
||
// 根据平均值和标准差计算可能的录取分数范围
|
||
int min = (int)Math.Floor(average - 1.96 * stdDev); // 使用 95% 置信区间
|
||
int max = (int)Math.Ceiling(average + 1.96 * stdDev); // 使用 95% 置信区间
|
||
|
||
// 确保范围在有效分数范围内(0 到 750)
|
||
min = Math.Max(min, 0);
|
||
max = Math.Min(max, 750);
|
||
|
||
// 计算你的分数在范围内的百分比
|
||
// 计算你的分数在范围内的百分比
|
||
double percentage = 0;
|
||
if (max != min)
|
||
percentage = (double)(requestScore - min) / (max - min);
|
||
|
||
return percentage.ToString();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 冲稳保百分比(逻辑待调整)
|
||
/// </summary>
|
||
/// <param name="lowScore"></param>
|
||
/// <param name="requestScore"></param>
|
||
/// <returns></returns>
|
||
public static string GetPlanPercentage(int lowScore, int requestScore)
|
||
{
|
||
int scoreGap = requestScore - lowScore; // 正确计算方式int scoreGap = requestScore - lowScore; // 正确计算方式
|
||
double probability;
|
||
|
||
if (scoreGap < -25) // 🎯 冲:低于目标分 25 分以上,低概率,最多 30%
|
||
{
|
||
probability = 0.05 + (25.0 / (-scoreGap + 1)) * 0.25;
|
||
probability = Math.Min(probability, 0.3);
|
||
}
|
||
else if (scoreGap >= -25 && scoreGap <= 0) // 🎯 稳:接近目标分,概率 40%-70%
|
||
{
|
||
probability = 0.4 + ((25 + scoreGap) / 25.0) * 0.3;
|
||
}
|
||
else // 🎯 保:已达标,分差越大概率越高,70%-99%
|
||
{
|
||
probability = 0.7 + (Math.Min(scoreGap, 30) / 30.0) * 0.29; // 最高 99%
|
||
}
|
||
|
||
return (probability * 100).ToString("0") + "%";
|
||
}
|
||
|
||
|
||
/// 根据分数计算冲、稳、保类型(冲=2,稳=1,保=0)
|
||
/// </summary>
|
||
/// <param name="lowScore">最低分</param>
|
||
/// <param name="requestScore">目标分</param>
|
||
/// <returns>0-保,1-稳,2-冲</returns>
|
||
public static int GetPlanScore(int lowScore, int requestScore)
|
||
{
|
||
int scoreGap = requestScore - lowScore; // 正确计算方式
|
||
|
||
if (scoreGap < -25)
|
||
{
|
||
return 2; // 🎯 冲
|
||
}
|
||
else if (scoreGap >= -25 && scoreGap <= 0)
|
||
{
|
||
return 1; // 🎯 稳
|
||
}
|
||
else
|
||
{
|
||
return 0; // 🎯 保
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// 百分比
|
||
/// </summary>
|
||
/// <param name="LowScore"></param>
|
||
/// <param name="requestScore"></param>
|
||
/// <returns></returns>
|
||
public static string GetAvgPlanPercentage(double LowScore, int requestScore)
|
||
{
|
||
|
||
//int minscore = requestScore - 60;//最小
|
||
//int constscore = requestScore;//中位数
|
||
//int maxscore = requestScore + 15;//最大
|
||
string percentage = string.Empty;
|
||
if (LowScore >= requestScore - 60 && LowScore <= requestScore - 26)
|
||
{
|
||
|
||
double zval = (requestScore / LowScore) > 1 ? 0.98 : (requestScore / LowScore);
|
||
percentage = zval.ToString("0%");
|
||
}
|
||
if (LowScore <= requestScore - 1 && LowScore >= requestScore - 26)
|
||
{
|
||
double zval = (requestScore / LowScore) > 1 ? 0.79 : (requestScore / LowScore) * 0.8;
|
||
percentage = zval.ToString("0%");
|
||
}
|
||
if (LowScore >= requestScore && LowScore <= requestScore + 30)
|
||
{
|
||
double zval = (requestScore / LowScore + 30) * 0.3 > 1 ? 0.29 : (requestScore / LowScore);
|
||
percentage = zval.ToString("0%");
|
||
}
|
||
|
||
return percentage;
|
||
}
|
||
|
||
}
|