生成若干个随机数等于某个指定的和

  背景是来自博问,就趁手写了写代码,是实话有点紧张了,毕竟是有人看的,急于回复,言语有些不严谨,图还画错了一个地方,程序的初始值是0,人为习惯写成了1,反反复复回复了一遍,被反对了一下,原本是支持的....

  所以对自己刚刚的表现不是很满意,于是又优化了一下重新回答了那个人,并得到了青睐,算我自作多情吧,也许别人只是借鉴了下思路,废话不多说,上code!

        static void Main(string[] args)
        {
            List<int> resultList = new List<int>();
            int curr = 100;
            Random ir = new Random();
            int index = ir.Next(1,10);
            List<int> list = new List<int>();
            for (int i = 0; i < index; i++)
            {
                Random r = new Random();
                int v = r.Next(100);
                do
                { 
                    v = r.Next(100);
                } while (list.Contains(v));
                list.Add(v);
            }
            list.Sort();
            Console.WriteLine(curr-list[list.Count-1]);
            for (int i = list.Count-1; i >=1; i--)
            { 
                Console.WriteLine(list[i] - list[i-1]);
            } 
            Console.WriteLine(list[0]-0);
        }

  

resultList是结果集合,为了输出具体数字就没多事存集合了,真正用到的时候会存到集合里
int index = ir.Next(1,10);//毕竟个数不能写死,这样就不好玩了,回答别人博问的最后答案没有这个,是写死的,不过她应该自己能改过来吧,我对自己不满意也就没脸继续去回复了~
do
{ 
    v = r.Next(100);
} while (list.Contains(v));//随机会存在重复的问题,因此做个do-while处理一下,呵呵,记得今年在某个地方写代码这里还出现过死循环,这样一说这里还是有死循环漏洞的,应该加个循环次数限制,万一真的达到某个条件就一直循环呢,那就尴尬大了
list.Sort();//线段之间的点是需要按顺序来的,可惜不能倒叙,不然下面的for也不必i--了,说实话i--反着来还是第一次,挺不习惯
Console.WriteLine(curr-list[list.Count-1]);
for (int i = list.Count-1; i >=1; i--)
{ 
    Console.WriteLine(list[i] - list[i-1]);
} 
Console.WriteLine(list[0]-0);//输出头尾的代码看着很不雅观,没办法, 要想在一个for里输出估计又要加逻辑,何必呢,简单来,不雅观的地方封装成方法折叠嘛。

--------------------------------------------------------------

上面是图,下面是博问截取的内容,错误的地方修饰了一下

--------------------------------------------------------------

设数字为N,和的范围为1-N。

1-N之间是若干节点(位置),假设为a,b,c。

线的长度是N,N的长度=各个线段的和

也就是N=(n-c)+(c-b)+(b-a)+(a-0);

SO,可以得出n-c、c-b、b-a、a-0就是你要的数。

同理,可以根据自己的需要改成a...n-1个节点

--------------------------------------------------------------

  怎么说呢,算是一次经验和教训吧,希望自己以后再回答别人问题时不要急于求成,写好了Demo再给人家,减少别人的问题,当然授人以鱼不如授人以渔,思路也很重要,给思路是给别人的,给源码其实除了方便别人,也是对自己的锻炼吧,有些东西只是想一想不写出来,和亲自去实践一下,还是有很大区别的。

  就不发首页了,指不定被踢下来,不过说实话这种经历还是想让更多人看到的,毕竟有问题也能一起交流交流,算了,家丑不外扬,自己知道就好,嗯,挺好的,就这样!

续:输出的值之间差不能太大,所以重新写了

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

        static void Main(string[] args)
        {
            Random random = new Random();
            var intList = new List<int>();
            int mutil = 100;
            int du = 10;
            do
            {
                int index = random.Next(1, du);
                if (index > 0)
                {
                    intList.Add(index);
                }
            } while (!(intList.Sum() >= mutil - du));
            intList.Add(mutil - intList.Sum());
            foreach (var item in intList)
            {
                Console.WriteLine(item);
            }
            Console.WriteLine("集合值:"+intList.Sum());
        }

每次添加10以内的值,在最后一次“可能” 添加满的时候停止循环,然后根据总数做减法得出最后一个值。

原文地址:https://www.cnblogs.com/sunshine-wy/p/7891613.html