2013-06-12 2 views
1

Я работаю над отчетом на C#, в котором мне дано общее количество отпечатков, напечатанных отделом, и я должен их распространять в соответствии с датой месяца, когда 10 марта распечатаны и т. д. до 31 марта.Сгенерировать 30 случайных чисел из заданной суммы

У меня есть форма, которая учитывает общее количество распечаток. У меня есть Селектор месяца.

От месяца я получаю общее количество дней, которое является общее число будет генерироваться, например: 30 или 31 или 28

Сценарий:

В марте месяце 2000 Печатает аутов Общая сумма месяц: 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(); 

, что происходит, я n конечных чисел оно обращается в нуль. Я хочу Нормально распределенный, как и по одному индексу, сначала сохраняет максимальное значение, а в конце он уменьшается.

У нас есть третья партия Ricoh Print/PhotoCopier Machine, и третьи стороны оплачивают нам определенную сумму, которую они подсчитали, что наш отдел напечатал 3000 распечаток, поэтому мы должны распределять их в дни произвольно, распечатывать отчет и получить счет-фактуру от нашего руководителя отдела.

Люди отдела делают это на предел, я предложил им дать им решение. Форма заявки для Windows построена, и я просто поставить эту логику, вот и все .. Спасибо за ваши отзывы

+9

Начните писать код, обратитесь за помощью, когда застрянете. –

+0

Как бы вы сделали это на бумаге? –

+0

Для равномерного распределения используйте: http://stackoverflow.com/a/16884017/2192494 –

ответ

0

Если вы хотите иметь 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

+0

Математически это распределяется неравномерно. – SimpleVar

+0

@YoryeNathan Я исправил это. –

+0

Вы действительно не изменили, что он делает. Сам алгоритм ошибочен.Или, может быть, спецификации. Я не уверен. Вы либо получите много нулей, либо результаты короче 30. Не уверен, что они действительны в соответствии с OP. – SimpleVar

3

Вы можете легко сделать это с перегородками. В течение 4-дневного месяца, который произвел 10 вещей: сгенерируйте 3 случайных числа от 0 до 10 (включительно). Сортируйте их и добавьте 10 в список номеров. Таким образом, мы, возможно:

3 6 6 10 

Каких Перегородки наших отпечатков:

p p p | p p p | | p p p p 
+1

Да, это правильный способ сделать это. Код [здесь] (http://stackoverflow.com/a/16884017/2192494). –

+0

Я не уверен, что это единообразно. Я не думал об этом много теоретически, но, просто эмпирически выполняя его в R и глядя на гистограммы, он выглядит сильно предвзятым до небольших чисел, например. Hist (разн (сортировки (с (0, образец (10000,200, замените = Т), 10000)))). С другой стороны, я не вижу, как это может быть однородным и складываться. Мне нужно думать об этом более теоретически. – frankc

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) 

Ли Даниэль Крокера, связанной с this, хотя я считаю это лучшим решением. Очень аккуратный и интуитивно понятный.

+0

Это будет работать, но не будет равномерным. Правильный алгоритм [здесь] (http://stackoverflow.com/a/16884017/2192494). –

+0

@LeeDanielCrocker Я согласен. Это прекрасное решение. Но я не уверен, что моя неформальная ... Не могли бы вы объяснить, почему это так? – SimpleVar

+0

Очевидным является то, что ваш метод никогда не производит никаких значений вне диапазона [70, 130]. –

Смежные вопросы