繁体   English   中英

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

[英]Generate 30 Random Numbers from a given sum

我正在使用C#编写一份报告,该报告中提供了部门打印的总数,我必须根据3月1日打印出纸张的月份(截至3月31日)进行分发。

我有一张表格,它记录了总的打印输出数。 我有一个月选择器。

从Month中,我得到的总天数是要生成的总数,例如: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();

发生的事情是在结尾数字变为零。 我希望正态分布像在一个索引上一样,它首先存储最大值,最后减小。

我们安装了第三方第三方理光打印/影印机,第三方向我们开具了一定数量的账单,他们计算出我们部门已经打印了3000份打印输出,因此我们必须在几天内随机分发它们,打印出报告并从中获取付款发票我们部门的负责人

部门人员是在excel上完成的,我为他们提供了解决方案。 Windows窗体应用程序已构建,我仅需输入所有这些逻辑即可。.感谢您的反馈

您可以使用分区轻松地做到这一点。 对于一个产生10件东西的4天月份:生成3个介于0和10(含)之间的随机数。 对它们进行排序,然后将10附加到数字列表中。 因此,我们也许有:

3 6 6 10

哪个分区我们的印刷品:

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

如果您想要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;

它会给你:

在此处输入图片说明

这是我产生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)与此相关 ,我认为这是一个更好的解决方案。 非常简洁直观。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM