如题!这个怎么做?先谢谢大家了!

解决方案 »

  1.   


            List<int> result = GetResult(2000, 10);
            static List<int> GetResult(int sum, int count)
            {
                int[] array = Enumerable.Range(0, sum).ToArray();
                List<int> result = new List<int>(count);
                int remain;
                while (true)
                {
                    remain = sum;
                    while (result.Count < count - 1)
                    {
                        int avg = (remain / (count - result.Count));
                        //根据鸽笼原理,必须有一个值在范围
                           //avg + Environment.TickCount % (remain - avg)之内
                        int value = array[avg + Environment.TickCount % (remain - avg)];
                        result.Add(value);
                        remain -= value;
                    }
                    result.Add(sum - result.Sum());                //如果都不相同,表明取值成功,否则重新取值
                    if (result.Distinct().Count() == result.Count)
                    {
                        break;
                    }
                    else
                    {
                        result.Clear();
                    }
                }
                return result;
            }
      

  2.   

    比如定值为A,那么就以 A/n 作为随机数的最大值,生成n-1个随机数,最后一个随机数采用A减去前面n-1个随机数的和的方式生成,不就OK了吗?
      

  3.   

    public static void Main(string[] args)
            {
                int sum = 100;
                int count = 5;
                int n = 0;
                Random rd = new Random();
                for (int i = 1; i <= count - 1; i++)
                {
                    do
                    {
                        n = rd.Next(1,sum);
                    }
                    while (n > sum + i - count);
                    sum = sum - n;
                    Console.Write(n + "  ");
                }
                Console.Write(sum);
                Console.ReadKey();
            }
      

  4.   

    var r = from a in Enumerable.Range(1, n)
                        from b in Enumerable.Range(a, n)
                        from c in Enumerable.Range(b, n)
                        where a + b + c < n 
                        select new { A = a, B = b, C = c };
      

  5.   

    方法很多,随机生成n-1个小于等于m的数,排个序,最前面补个0,最后面补个m,这n+1个数相邻的差共n个数,和为m比如n=5,m=40,随机4个小于40的数,38,12,27,1,排个序1 12 27 38,前面补0后面补m,0 1 12 27 38 40
    5个数为相邻2项的差,1,11,15,11,2
      

  6.   

    楼主可能要的是这种效果:给定 sum 和 n,
    第一步:生成包含 n 个数的序列,其中每个数都是 sum/n,第二步:给“每一对”加上随机的偏移量,比如:
    offset = rnd.next();
    numbers[0] = numbers[0] + offset;
    numbers[1] = numbers[1] - offset;第三步不是必须的,但是如果你追求好看,就把这个序列打乱,让它看起来像是随机的
      

  7.   

    lz的要求不够明确啊,n个数可以有重复的吗?