improve:点名算法

This commit is contained in:
2025-11-15 19:34:52 +08:00
parent 2acc7ada30
commit a72022704e
@@ -664,6 +664,62 @@ namespace Ink_Canvas
return baseProbability;
}
/// <summary>
/// 根据频率统计更新保存的概率
/// </summary>
private static void UpdateProbabilitiesByFrequency()
{
if (historyData == null || historyData.NameFrequency == null || historyData.NameFrequency.Count == 0)
return;
if (historyData.NameProbabilities == null)
historyData.NameProbabilities = new Dictionary<string, double>();
// 计算总选中次数
int totalSelections = historyData.NameFrequency.Values.Sum();
if (totalSelections == 0)
return;
// 计算平均频率
int uniqueNamesCount = historyData.NameFrequency.Keys.Count;
if (uniqueNamesCount == 0)
return;
double averageFrequency = 1.0 / uniqueNamesCount;
// 遍历所有在频率统计中的人员
foreach (var kvp in historyData.NameFrequency)
{
string name = kvp.Key;
int nameCount = kvp.Value;
// 获取当前保存的概率(如果不存在则使用默认值)
double currentProbability = historyData.NameProbabilities.ContainsKey(name)
? historyData.NameProbabilities[name]
: DEFAULT_PROBABILITY;
// 计算该名字的选中频率
double nameFrequency = (double)nameCount / totalSelections;
// 如果该名字的频率低于平均频率,则增加概率并保存
if (nameFrequency < averageFrequency)
{
// 计算频率差异比例
double frequencyRatio = nameFrequency / averageFrequency;
double boostFactor = FREQUENCY_BOOST_FACTOR * (1.0 - frequencyRatio);
// 增加概率
double boostedProbability = currentProbability * (1.0 + boostFactor);
// 限制最大概率,避免过高
boostedProbability = Math.Min(boostedProbability, DEFAULT_PROBABILITY * 2.0);
// 保存更新后的概率
historyData.NameProbabilities[name] = boostedProbability;
}
}
}
/// <summary>
/// 基于概率的随机选择
/// </summary>
@@ -830,6 +886,9 @@ namespace Ink_Canvas
}
}
// 根据频率统计更新概率
UpdateProbabilitiesByFrequency();
historyData.LastUpdate = DateTime.Now;
// 保存到文件