[英]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.