.net c# 数组缩放int[30]->int[50]/int[40]->int[20]

        private int[] resizeArray(int[] ratelist, int directsize = 10)
        {
            //rate list
            //int[] ratelist = new int[random.Next(10, 30)];
            //for (var k = 0; k < ratelist.Length; k++)
            //{
            //    ratelist[k] = random.Next(10, 1000);
            //}
            Console.WriteLine("-----------------------------------------------------------");

            for (var k = 0; k < ratelist.Length; k++)
            {
                Console.Write($"{k}::{ratelist[k]},");
            }

            int[] directlist = new int[directsize];

            double voes = Math.Round((double)ratelist.Length / (double)directlist.Length, 2);
            Console.WriteLine($"每个份额:{voes}");


            var hitindex = 0;
            //剩余的还有多少比率给下一个
            double lessrate = 0;
            var rateindex = 0;
            do
            {

                Console.WriteLine($"--开-原:{rateindex} 目标:{hitindex},结余{lessrate}");

                //缩小 2.2
                if (voes >= 1)
                {
                    #region 处理数组缩小


                    if (lessrate > 0)
                    {
                        //有结余
                        directlist[hitindex] += (int)(ratelist[rateindex] * lessrate);
                        rateindex++;
                        //thisleft = 1 - lessrate;//当前这个还剩余多少

                        var lessneed =Math.Round(voes - lessrate,2);
                        if (lessneed > 0)
                        {
                            if (lessneed > 1)
                            {
                                //2.2
                                var kindex = (int)lessneed;//1.2=1 1.9=1?
                                if (kindex > lessneed) { kindex = kindex - 1; }
                                for (var k = 0; k < kindex; k++) {
                                    directlist[hitindex] += ratelist[rateindex];
                                    rateindex++;
                                }

                                if (rateindex < ratelist.Length)
                                {
                                    var less = lessneed - kindex;
                                    if (less > 0)
                                    {
                                        directlist[hitindex] += (int)(ratelist[rateindex] * less);
                                        lessrate = 1 - less;
                                    }
                                    else
                                    {
                                        lessrate = 0;
                                    }
                                }
                            }
                            else { 
                              

                                directlist[hitindex]+= (int)(ratelist[rateindex] * lessneed);
                                lessrate = 1 - lessneed;
                                if (lessneed == 1) { 
                                  rateindex++;
                                }
                            }
                        }
                        else {
                            lessrate = 0;
                            rateindex++;
                        }

                    }
                    else {
                        //无结余
                        var kindex = (int)voes;
                        if (kindex > voes) { kindex = kindex - 1; }
                        for (var k = 0; k < kindex; k++) {
                            directlist[hitindex] += ratelist[rateindex];
                            rateindex++;
                        }
                        var less = voes - kindex;
                        if (less > 0)
                        {
                            directlist[hitindex] += (int)(ratelist[rateindex] * less);
                            lessrate = 1 - less;
                        }
                        else
                        {
                            lessrate = 0;
                           // rateindex++;
                        }


                    }

                    if (lessrate > 0)
                    {
                        lessrate = Math.Round(lessrate, 2);
                    }
                    #endregion
                }
                else
                {
                    //放大
                    #region 处理数组放大

                    if (lessrate > 0)
                    {
                        if (lessrate > voes)
                        {
                            //剩余的足够下一个使用
                            directlist[hitindex] += (int)(ratelist[rateindex] * voes);
                            lessrate = Math.Round(lessrate - voes, 2);
                        }
                        else
                        {
                            //剩余的不够下一个使用
                            directlist[hitindex] += (int)(ratelist[rateindex] * lessrate);
                            rateindex++;
                            //还需要多个
                            var needrate = Math.Round(voes - lessrate, 2);
                            if (needrate > 0)
                            {
                                directlist[hitindex] += (int)(ratelist[rateindex] * needrate);
                                lessrate = 1 - needrate;
                            }
                            else
                            {
                                lessrate = 0;
                            }
                        }
                    }
                    else
                    {
                        directlist[hitindex] += (int)(ratelist[rateindex] * voes);
                        lessrate = 1 - voes;

                    }
                    #endregion

                }

                if (lessrate > 0)
                {
                    lessrate = Math.Round(lessrate, 2);
                }

             //   Console.WriteLine($"--末-原:{rateindex} 目标:{hitindex},结余{lessrate}");

                hitindex++;

            } while (hitindex < directlist.Length);


            for (var k = 0; k < directlist.Length; k++)
            {
                Console.Write($"{k}::{directlist[k]},");
            }
            Console.WriteLine();
            Console.WriteLine($"缩放损失:{ratelist.Sum()}:::{directlist.Sum()}");
            Console.WriteLine("==============================================================");
            return directlist;
        }

这个东西干嘛用呢????

计算概率的时候

目前有个问题 估计是要进行缩放,目前采用2位小数,越接近损失越大,估计用4位数,或者原数组进行等比放大,有效果!

转化成字符串描述:

                //rate list
                int[] ratelist = new int[random.Next(1, 10)];
                for (var k = 0; k < ratelist.Length; k++)
                {
                    ratelist[k] = random.Next(100, 1000);
                }

                var newsize = resizeArray(ratelist);

                //.oOHHOo.

                var hightlow = newsize.Max() - newsize.Min();

                var persize = hightlow / 6;

                int[] everysize = new int[6];
                for (var k = 0; k < 6; k++)
                {
                    everysize[k] = newsize.Min() + k * persize;
                }

                var strs = new string[] { ".", "o", "O", "H" };

                var newstrimage = new string[newsize.Length];
                for (var k = 0; k < newsize.Length; k++)
                {

                    var val = newsize[k];
                    newstrimage[k] = strs[0];

                    if (val >= everysize[1])
                    {
                        newstrimage[k] = strs[1];
                    }

                    if (val >= everysize[3])
                    {
                        newstrimage[k] = strs[2];
                    }

                    if (val >= everysize[5])
                    {
                        newstrimage[k] = strs[3];
                    }

                }
                Console.WriteLine("数组数字:" + String.Join("|", newsize));
                Console.WriteLine("图形预览:" + String.Join("", newstrimage));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贴代码科技-致力于开发更加适用的应用

要不请我喝杯咖啡!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值