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
相关产品推荐
相关产品推荐

