C# 如何循环随机数以使结果等于用户输入摘要

C# 如何循环随机数以使结果等于用户输入摘要,c#,asp.net,random,C#,Asp.net,Random,我有这样的问题。 用户(A)在我的应用程序中输入500000,然后我想生成50个随机5位数字,当汇总50个随机数字需要等于500000时,如何做就像我已经尝试过但它不起作用这是我的代码 int balane = 500000; int nums = 50; int max = balane / nums; Random rand = new Random(); int newN

我有这样的问题。 用户(A)在我的应用程序中输入500000,然后我想生成50个随机5位数字,当汇总50个随机数字需要等于500000时,如何做就像我已经尝试过但它不起作用这是我的代码

            int balane = 500000;
            int nums = 50;
            int max = balane / nums;
            Random rand = new Random();
            int newNum = 0;
            int[] ar = new int[nums];
            for (int i = 0; i < nums - 1; i++)
            {
                newNum = rand.Next(max);
                ar[i] = newNum;
                balane -= newNum;
                max = balane / (nums - i - 1);

                ar[nums - 1] = balane;
            }

            int check = 0;
            foreach (int x in ar)
            {
                check += x;
            }
int balane=500000;
int nums=50;
int max=巴兰尼/努姆斯;
Random rand=新的Random();
int newNum=0;
int[]ar=新的int[nums];
对于(int i=0;i
我告诉你的结果不起作用,因为在我的数组列表中,我的值大于5位,但结果等于500000

如何解决这个问题?非常感谢。

这对我很有用

    public static void test(int balance = 500000, int nums = 50, int max_digits = 5)
    {
        int rest = balance;
        var max_value = (int)Math.Pow(10, max_digits) - 1;

        var rand = new Random();

        int[] ar = new int[nums];
        for (int i = 0; i < nums - 1; i++)
        {
            var max = rest / (nums - i);
            if (max > max_value) max = max_value;
            var newNum = rand.Next(max);
            ar[i] = newNum;
            rest -= newNum;
        }
        while (rest > max_value)
        {
            var all_values_are_max = true;
            for (int i = 0; i < nums - 1; i++)
            {
                if (ar[i] < max_value)
                {
                    var d = (int)((max_value - ar[i]) / 10.0); // 10% increase
                    ar[i] += d;
                    rest -= d;
                    all_values_are_max = false;
                }
            }
            if (all_values_are_max)
                throw new Exception("This is not possible at all!");
        }
        while (rest < 0)
        {
            for (int i = 0; i < nums - 1; i++)
            {
                if (ar[i] > 0)
                {
                    var d = (int)(ar[i] / 20.0); // %5 decrease
                    ar[i] -= d;
                    rest += d;
                }
            }
        }
        ar[nums - 1] = rest;

        int check_sum = 0;
        foreach (int x in ar)
        {
            check_sum += x;
            if (x > max_value || x < 0)
                MessageBox.Show("wrong value");
        }
        if (check_sum != balance)
            MessageBox.Show("Error: sum is " + check_sum);

        MessageBox.Show("ok");
    }
公共静态无效测试(整数余额=500000,整数位数=50,整数最大位数=5)
{
int rest=平衡;
var max_value=(int)Math.Pow(10,max_位)-1;
var rand=new Random();
int[]ar=新的int[nums];
对于(int i=0;i最大值)最大=最大值;
var newNum=下一个随机数(最大值);
ar[i]=newNum;
rest-=newNum;
}
同时(静止>最大值)
{
var所有值均为真;
对于(int i=0;i0)
{
var d=(int)(ar[i]/20.0);//%5减少
ar[i]=d;
剩余+=d;
}
}
}
ar[nums-1]=剩余;
int check_sum=0;
foreach(整数x单位为ar)
{
检查_sum+=x;
如果(x>max|u值| x<0)
MessageBox.Show(“错误值”);
}
如果(检查金额!=余额)
MessageBox.Show(“错误:总和为”+检查总和);
MessageBox.Show(“ok”);
}
例如,
test(500000,50)
在任何时候都可以正常工作,但是
test(500000,5)
抛出异常,因为这是不可能的

也许可以尝试以下方法:

var rnd = new Random();

var numbers = Enumerable.Range(0, 50).Select(x => rnd.Next(500_000)).OrderBy(x => x).ToArray();

numbers = numbers.Skip(1).Zip(numbers, (x1, x0) => x1 - x0).ToArray();

numbers = numbers.Append(500_000 - numbers.Sum()).ToArray();

Console.WriteLine(numbers.Count());
Console.WriteLine(numbers.Sum());
这将产生:

50 500000 50 500000
其工作原理是生成50个介于0和499999之间的随机数。然后它对它们进行升序排序,然后得到每个连续对之间的差值。根据定义,这将产生一组49个值,几乎总计500000个。然后,只需通过执行
500\u 000-numbers.Sum()

添加一个缺少的数字,您显示的屏幕截图与您发布的代码不同。屏幕截图使用
rand.Next(099999)
,而您作为文本发布的代码使用
rand.Next(0,max)
。使用
rand.Next(0,max)
的代码有效。(无可否认,我只在循环后分配了代码>AR [num - 1 ] < /COD>,但这是另一个问题。什么是期望的输出?正确的,所以在这一点上,你的算法被破坏了。考虑一下<代码> rand。
始终可以返回0…此时,您的最终元素必须是原始目标。您需要考虑应用最小值和最大值。请注意,如果删除屏幕截图,您的问题会更好(IMO),请添加一个
控制台。WriteLine(ar[nums-1])
在循环之后,只需包含循环的输出。此处不需要图像。为什么要再次发布相同的问题?@user3001046如果需要,请更新原始问题,但发布重复的问题是违反规则的。此问题与同一用户的问题完全相同。请将此问题的答案移至不鼓励重复发布。@cwharris-完成,我结束了此问题。此问题与同一用户的问题完全相同。请将此答案移至该问题以不鼓励重复发布。