You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SqlServer数组号码与TBResult表开奖数据匹配统计需求

实现方案

1. 生成1-25范围内不重复的15个随机号码

用洗牌算法高效生成无重复随机数,避免循环判断的低效问题:

// 生成1-25的完整数组
int[] allNumbers = Enumerable.Range(1, 25).ToArray();
// 洗牌打乱顺序
Random rnd = new Random();
for (int i = allNumbers.Length - 1; i > 0; i--)
{
    int j = rnd.Next(i + 1);
    (allNumbers[i], allNumbers[j]) = (allNumbers[j], allNumbers[i]);
}
// 取前15个作为目标随机号码
int[] randomNumbers = allNumbers.Take(15).ToArray();

// 将随机号码赋值到LabelResult数组
for (int i = 0; i < randomNumbers.Length; i++)
{
    LabelResult[i].Text = randomNumbers[i].ToString();
}

2. 数据库统计命中期数

方案一:SQL端统计(高效,适合大数据量)

如果你的SQL Server 2014没有STRING_SPLIT(该函数2016+支持),可以先自定义字符串拆分函数,或者直接把随机号码拼入SQL语句:

-- 替换@RandomNumbers为生成的逗号分隔随机号码字符串,例如'2,5,7,11,13,15,17,19,21,23,1,4,6,8,10'
DECLARE @RandomNumbers NVARCHAR(100) = '你的随机号码字符串';

WITH ResultHits AS (
    SELECT 
        ContestNumber,
        (
            SELECT COUNT(*) 
            FROM (
                VALUES (Num1), (Num2), (Num3), (Num4), (Num5),
                       (Num6), (Num7), (Num8), (Num9), (Num10),
                       (Num11), (Num12), (Num13), (Num14), (Num15)
            ) AS t(Num)
            WHERE t.Num IN (SELECT CAST(value AS INT) FROM STRING_SPLIT(@RandomNumbers, ','))
        ) AS HitCount
    FROM TBResult
)
SELECT 
    HitCount,
    COUNT(DISTINCT ContestNumber) AS PeriodCount
FROM ResultHits
WHERE HitCount BETWEEN 11 AND 15
GROUP BY HitCount
ORDER BY HitCount DESC;

方案二:代码端统计(灵活,适合小数据量)

直接读取所有开奖记录,在代码中计算命中数并统计:

string connStr = "你的SQL Server连接字符串";
// 初始化统计容器,默认命中数为0
Dictionary<int, int> hitStats = new Dictionary<int, int>()
{
    {11, 0}, {12, 0}, {13, 0}, {14, 0}, {15, 0}
};

using (SqlConnection conn = new SqlConnection(connStr))
{
    conn.Open();
    string sql = "SELECT ContestNumber, Num1, Num2, Num3, Num4, Num5, Num6, Num7, Num8, Num9, Num10, Num11, Num12, Num13, Num14, Num15 FROM TBResult";
    using (SqlCommand cmd = new SqlCommand(sql, conn))
    {
        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            HashSet<int> randomSet = new HashSet<int>(randomNumbers);
            while (reader.Read())
            {
                int hitCount = 0;
                // 遍历当前记录的15个号码字段
                for (int i = 1; i <= 15; i++)
                {
                    int num = reader.GetInt32(i);
                    if (randomSet.Contains(num)) hitCount++;
                }
                // 统计命中11-15的期数
                if (hitCount >= 11 && hitCount <= 15)
                {
                    hitStats[hitCount]++;
                }
            }
        }
    }
}

3. 在Label控件展示统计结果

按指定格式拼接文本并赋值到Label:

StringBuilder sb = new StringBuilder();
sb.AppendLine("命中统计:");
sb.AppendLine($"命中15个号码:{hitStats[15]} 期");
sb.AppendLine($"命中14个号码:{hitStats[14]} 期");
sb.AppendLine($"命中13个号码:{hitStats[13]} 期");
sb.AppendLine($"命中12个号码:{hitStats[12]} 期");
sb.AppendLine($"命中11个号码:{hitStats[11]} 期");

// 假设用于展示的Label控件名为lblStats
lblStats.Text = sb.ToString();

排查要点

  • 随机数重复:确保用洗牌算法生成,避免循环随机+判断的低效且易重复逻辑
  • 数据库字段类型:确认Num1-Num15为int类型,读取时避免类型转换错误
  • 期数重复统计:如果同一个ContestNumber对应多条记录,需用COUNT(DISTINCT ContestNumber)确保期数不重复统计

内容的提问来源于stack exchange,提问作者Edilson Lemos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 02:52:09