首页新闻找找看学习计划

如何实现一个数字随机分成一个数组

0
悬赏园豆:50 [已解决问题] 解决于 2017-11-24 16:56

例如 一个数字100,怎么把100随机分成一个数组,并且这个数组里的和是100,并且这个数组里的每个数字差都不会太大,比如100拆成10,20,15,20,5,30。数组和一定是int类型。求解。

-小确幸的主页 -小确幸 | 初学一级 | 园豆:35
提问于:2017-11-24 14:41
< >
分享
最佳答案
-1

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

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

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

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

SO,可以得出a,b,c就是你要的三个数。

同理,你可以根据自己的需要改成a...n-1个节点,可以是三个数,也可以是四个数,可以随机出一个1至(n-1)的数

“每个数字差都不会太大”,这个就得另外写逻辑了,做减法判断差,如果超过你的指定值,重新随机,如此循环xx下(或者根据XX下选择差最小的那组)

 

 

收获园豆:40
默卿 | 老鸟四级 |园豆:3348 | 2017-11-24 15:52

线段的长度应该是0-n  哈,是从0开始的,我画图的时候没注意  这样: 0_____a___b____c___n 

默卿 | 园豆:3348 (老鸟四级) | 2017-11-24 15:55

@七芯海棠: 大神,看起来思路应该是这样的,尴尬的是我有点蒙。

-小确幸 | 园豆:35 (初学一级) | 2017-11-24 16:08
        static void Main(string[] args)
        {
            List<int> resultList = new List<int>();
            int curr = 100;//
            int index = 3;//节点个数(3个节点会生成4条线段,也就是4个值)
            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);
        }
默卿 | 园豆:3348 (老鸟四级) | 2017-11-24 16:50

@七芯海棠: 谢谢,已解决

-小确幸 | 园豆:35 (初学一级) | 2017-11-24 16:54

@七芯海棠: 刚刚认真测试了下你的这个方法,其实还是有一点缺陷,有时候分的很平均,但是有时候各个数之间相差也很大,
我的最终解决方法
static void Main(string[] args)
{

        Random random = new Random();
        var intList = new List<int>();
        var oldmutil =100;
        var mutil = 100;
        while (mutil > 0)
        {
            var num = random.Next(1, mutil);
            if (oldmutil < 10)
            {
                intList.Add(num == 0 ? 1 : num);
                if (mutil == 1) break;
                mutil -= num;
            }
            else
            {
                if (num <= oldmutil / 10)
                {
                    intList.Add(num == 0 ? 1 : num);
                    if (mutil == 1) break;
                    mutil -= num;
                }
            }
        }
        foreach (var item in intList)
        {
            Console.WriteLine(item);
        }

    }
-小确幸 | 园豆:35 (初学一级) | 2017-11-24 17:44

@如此拉风的女人: 

        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());
        }

看了你的最终方案我重新写了下  做了一些精简  O(∩_∩)O  

默卿 | 园豆:3348 (老鸟四级) | 2017-11-24 18:23

@七芯海棠: 可以,这很强势,不过如果mutil =100改成1000就要改du的值。不是很好

-小确幸 | 园豆:35 (初学一级) | 2017-11-24 18:38

@如此拉风的女人: du=mutil/10   可以把du的值取成mutil的十分之一,不过mutil大了,du值也变大的话,值之间的差也会变大的,du值不随着mutil变大的话生成的数的个数又居多,基于目前的逻辑两者不太好协调,只能基于实际情况互相折中了

默卿 | 园豆:3348 (老鸟四级) | 2017-11-24 18:45

@七芯海棠: 恩恩

-小确幸 | 园豆:35 (初学一级) | 2017-11-24 18:53
其他回答(2)
-1

创建集合;

随机0-100取数,插入集合;

判断是否小于100,是重复上步操作;

等于100直接结束;

大于100剔除最后那个数,直接凑一个数上去结束;

收获园豆:5
花飘水流兮 | 园豆:8450 (大侠五级) | 2017-11-24 15:33

谢谢,我试过,不满足条件

支持(0) 反对(0) -小确幸 | 园豆:35 (初学一级) | 2017-11-24 15:41

@如此拉风的女人: 那是你代码没写好三,逻辑是满足的。

支持(0) 反对(0) 花飘水流兮 | 园豆:8450 (大侠五级) | 2017-11-24 15:46
1

其实可以创建一个集合,然后随机生成一个数0-100之间的数,如果是100以内的,加入到集合中,再把那个0-100换成100-生成的数,依次往复,直到最后数为0 。那个集合就是所需要的集合(可以将生成的随机数转换为整数)

收获园豆:5
鸿燕藏锋 | 园豆:568 (小虾三级) | 2017-11-24 16:00

看看我写的代码,你可以随便输入要拆分的数字。然后就会生成。

支持(0) 反对(0) 鸿燕藏锋 | 园豆:568 (小虾三级) | 2017-11-24 16:57

@鸿燕藏锋: 像你这种就不行了,8和2差太大。43和6和1差太大。要求就是这些数组相差不能太大,

支持(0) 反对(0) -小确幸 | 园豆:35 (初学一级) | 2017-11-24 17:28

@如此拉风的女人: 的确是存在这种问题。那么对于产生随机数如何进行进行控制随机呢

支持(0) 反对(0) 鸿燕藏锋 | 园豆:568 (小虾三级) | 2017-11-24 17:30

@鸿燕藏锋: 不过还是谢谢你哦

支持(0) 反对(0) -小确幸 | 园豆:35 (初学一级) | 2017-11-24 17:30

@如此拉风的女人: 没事,我写的时候也感觉存在这种问题,那么知道如何解决吗?这就是产生随机数的时候没有想象中的那么随机,它是靠近那个自己输入的值的

支持(0) 反对(0) 鸿燕藏锋 | 园豆:568 (小虾三级) | 2017-11-24 17:31

@鸿燕藏锋: 你看我楼上那个大神写的就知道了,他代码都贴出来了。思路就是那样的,

支持(0) 反对(0) -小确幸 | 园豆:35 (初学一级) | 2017-11-24 17:34

@如此拉风的女人: OK

支持(0) 反对(0) 鸿燕藏锋 | 园豆:568 (小虾三级) | 2017-11-24 17:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册