从给定的总和生成30个随机数

时间:2013-06-12 03:23:16

标签: c# .net random

我正在编写一份C#报告,其中我给出了一个部门打印的总印刷数量,我必须根据3月1日打印出来的月份日期分发它们,等等到3月31日

我有一张表格可以计算总打印数量。 我有一个月选择器。

从月份开始,我得到总天数,即生成的总数,例如:30或31或28

场景:

2000年3月出版 月总和:2000 要生成的数字:31

这是我的代码

        int sum = 2345;
        int nums = 23;
        Random rand = new Random();
        int newNum = 0;
        int[] ar = new int[23];
        for (int i = 0; i < nums; i++)
        {
            newNum = rand.Next(0, sum);
            ar[i] = newNum;
            sum = sum - newNum;
        }
        for (int i = 0; i < 23 ; i++)
        {
            Console.WriteLine(ar[i]);

        }
        Console.ReadLine();
发生的事情是在结尾数字中它变为零。我希望正常分布在一个索引上,它首先存储最大值,最后减少。

我们安装了第三方Ricoh Print / PhotoCopier Machine并且第三方向我们收取了一定数额的费用,他们已经计算出我们部门已经打印了3000份打印件,所以我们必须在当天随机分发它们,打印报告并获取我们部门主管的付款发票。

部门人员正在excel上做这件事,我让他们给他们一个解决方案。 Windows窗体应用程序是构建的,我只需要把这个逻辑全部放在.. 感谢您的反馈

3 个答案:

答案 0 :(得分:4)

您可以使用分区轻松完成此操作。对于产生10件事的4天月份:产生0到10(含)之间的3个随机数。对它们进行排序并将10附加到数字列表中。所以我们也许:

3 6 6 10

我们的印刷品分区:

p p p | p p p | | p p p p

答案 1 :(得分:1)

如果您想要23个随机数,总和为2345,则可以使用以下代码:

        int sum = 2345;
        int nums = 23;
        int max = sum / nums;
        Random rand = new Random();
        int newNum = 0;
        int[] ar = new int[23];
        for (int i = 0; i < nums-1; i++) {
            newNum = rand.Next(max);
            ar[i] = newNum;
            sum-= newNum;
            max = sum / (nums-i-1);
        }
        ar[nums - 1] = sum;

它会给你:

enter image description here

答案 2 :(得分:0)

我的想法是生成30个具有特定总和的随机数:

int sum = 3000;
int size = 30; // assumes that (sum % size == 0)
int[] result = new int[size];
Random rand = new Random();
int x = sum / size;

for (int i = 0; i < size; i++)
{
    result[i] = x;
}

for (int i = 0; i < x; i++)
{
    var a = rand.Next(size - 1); // not sure if parameter is inclusive?
    var b = rand.Next(size - 1); // should return number between 0 and size-1 inclusively

    result[a]++;
    result[b]--;
}

int testSum = result.Sum(); // will equal "sum" (3000)

Lee Daniel Crocker与this有关,我认为这是一个更好的解决方案。非常整洁和直观。