You need to enable JavaScript to run this app. 使用C#填充SQL数据表时填充随机中断,val2随机值偶发不更新
优惠活动
大模型
产品
解决方案
定价
更多

使用C#填充SQL数据表时填充随机中断,val2随机值偶发不更新

根本原因定位

两处逻辑错位叠加后,就会出现观察到的随机数不更新、流程在随机节点中断的问题:

  • 数组清空操作参数错误
    Array.Clear方法的第三个入参为「需要从起始索引开始清除的元素总数」,而非要清除到的最大索引值。原代码中数组长度为3,传入的清除长度是array.Length - 1 = 2,实际仅会清除数组索引0、1位置的元素,索引2的位置会永久保留上一轮i循环写入的历史值,从未被重置。
  • val2去重逻辑顺序与校验范围完全失效
    原代码在进入重复校验流程前,就把第一次生成的val2直接写入了当前循环位置的array[j];后续如果触发重复判断、重新生成val2,数组中存储的依然是最初的旧值,校验基准从源头错位。
    同时代码仅在首次发现重复时生成1次新的随机值,既没有校验新生成的值是否依然和数组内的残留值、历史值重复,也没有把最终生效的val2同步到数组对应位置。一旦新生成的val2刚好和数组中未被清除的残留值匹配,就会出现“随机数停止更新、取值不变化”的假象,最终触发数据库插入的唯一约束冲突导致流程中断。
解决方案

按照上述问题逐点修正:

  • 修正数组清空参数,确保全量重置数组元素,消除残留脏值
  • 调整去重逻辑的执行顺序:先完成重复校验,再把最终确认不重复的val2写入数组
  • 把单次重新生成随机数的逻辑改成循环校验,直到生成的val2和数组内所有已有值不重复再停止
  • 将临时变量values的声明移动到循环内部,避免跨循环的变量残留

修复后的参考代码:

public static void GenerateLicenseTable()
{
    int arrayLength = 3;
    string[] array = new string[arrayLength];
    Random rnd = new Random();
    string tableName = "license_per_state";
    string colsNames = "state_id,license_id,from_age";

    for (int i = 1; i <= 50; i++)
    {
        // 全量清空数组所有元素,避免残留旧值
        Array.Clear(array, 0, array.Length);

        for (int j = 0; j < arrayLength; j++)
        {
            string val1 = i.ToString();
            string val2;
            // 循环生成不重复的val2,直到和数组已有值无冲突
            do
            {
                val2 = rnd.Next(1, 7).ToString();
            } while (array.Contains(val2));
            // 校验通过后再写入数组对应位置
            array[j] = val2;

            string val3 = rnd.Next(16, 22).ToString();
            string values = val1 + "," + val2 + "," + val3;
            RanDAL.Instance.NaiveInsertInto(tableName, colsNames, values);
        }
    }
}

注:上述修复逻辑使用Array.Contains简化了重复判断的书写,相比原代码的手动k循环校验,避免了漏比、错比的问题。


内容的提问来源于stack exchange,提问作者Harel Abudi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.08 19:36:00