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

时间:2018-06-16 08:02:14

标签: 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 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;
            }

我告诉你不工作的结果,因为在我的数组列表中,我的值超过5位但结果等于500000。

enter image description here

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

2 个答案:

答案 0 :(得分:0)

这对我有用

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

例如,test(500000,50)始终正常,但test(500000, 5)会抛出异常,因为不可能

答案 1 :(得分:0)

也许试试这个:

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

这可以通过在0到499,999之间生成50个随机数来实现。然后它会逐步对它们进行排序,然后得到每个连续对之间的差异。根据定义,这产生了一组49个值,几乎总计达到500,000。这只是通过500_000 - numbers.Sum()添加一个缺失的数字。