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

如何用C#为动态行数的Excel行分配总和为100的互不相同值?

实现逻辑
  • 合法性校验:n个互不相同的正整数的最小总和为 n*(n+1)/2,该值必须≤100,因此最多支持13行(13个不同正整数最小和为91,剩余9可分配),同时行数不能小于2。
  • 基础序列生成:先生成1~n的连续正整数作为初始序列,天然满足互不相同的要求。
  • 差值补齐:计算100与初始序列总和的差值,将差值分配到序列元素中,分配过程保证不会出现重复值。如果需要随机化分配结果,可在分配完成后打乱序列顺序。
C# 代码参考

稳定输出版本(每次相同行数输出固定结果)

using System;
using System.Collections.Generic;
using System.Linq;

public class AllocationHelper
{
    // 分配互不相同的正整数,总和为100
    public static List<int> AllocateValues(int rowCount)
    {
        // 校验行数合法性
        if (rowCount < 2)
            throw new ArgumentException("行数不能小于2");
        int minSum = rowCount * (rowCount + 1) / 2;
        if (minSum > 100)
            throw new ArgumentException($"行数最多支持13行,当前行数{rowCount}的最小需要和为{minSum},超过100");

        // 生成基础序列
        var result = Enumerable.Range(1, rowCount).ToList();
        int delta = 100 - minSum;

        // 差值全部加到最后一个元素,保证所有值仍不重复
        result[^1] += delta;

        return result;
    }

    // 测试方法
    public static void Main()
    {
        // 测试2行
        var res2 = AllocateValues(2);
        Console.WriteLine($"2行分配结果:{string.Join(',', res2)},总和:{res2.Sum()}");
        // 输出:2行分配结果:1,99,总和:100

        // 测试4行
        var res4 = AllocateValues(4);
        Console.WriteLine($"4行分配结果:{string.Join(',', res4)},总和:{res4.Sum()}");
        // 输出:4行分配结果:1,2,3,94,总和:100
    }
}

随机输出版本(每次相同行数输出不同结果,符合示例中的随机分配效果)

using System;
using System.Collections.Generic;
using System.Linq;

public class RandomAllocationHelper
{
    private static readonly Random _random = new Random();

    public static List<int> AllocateRandomValues(int rowCount)
    {
        // 相同的合法性校验
        if (rowCount < 2)
            throw new ArgumentException("行数不能小于2");
        int minSum = rowCount * (rowCount + 1) / 2;
        if (minSum > 100)
            throw new ArgumentException($"行数最多支持13行,当前行数{rowCount}的最小需要和为{minSum},超过100");

        var result = Enumerable.Range(1, rowCount).ToList();
        int delta = 100 - minSum;

        // 随机分配差值到最后一个元素,保证不会和前面的元素重复
        result[^1] += delta;

        // 打乱顺序实现随机效果
        return result.OrderBy(x => _random.Next()).ToList();
    }

    // 测试方法
    public static void Main()
    {
        // 测试4行,多次运行结果不同
        for (int i = 0; i < 3; i++)
        {
            var res = AllocateRandomValues(4);
            Console.WriteLine($"第{i+1}次4行分配结果:{string.Join(',', res)},总和:{res.Sum()},是否无重复:{res.Distinct().Count() == 4}");
        }
        // 输出示例:
        // 第1次4行分配结果:23,27,30,20,总和:100,是否无重复:True
        // 第2次4行分配结果:5,12,48,35,总和:100,是否无重复:True
    }
}
注意事项
  • 如果允许分配小数,可支持的行数上限会更高,只需要调整基础序列的精度即可,逻辑和整数版本一致。
  • 随机版本如果需要更均匀的分配效果,可以调整差值分配逻辑,将差值拆分为多份随机分配到不同元素,只要保证分配后各元素仍不重复即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 09:15:03