tuiwucarrer/Admin.NET/Admin.NET.Core/Util/MajorPlanscoreTool.cs

147 lines
5.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// 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;
}
}