2010-02-11 4 views
2

Я пытаюсь сгенерировать некоторые тестовые данные.Распределение назначений в диапазоне дат

Скажите, что у меня 1000 назначений, которые мне нужно выделить в диапазоне дат.

Теперь мне нужно распределить эти встречи так, чтобы в конце месяца было так много назначений в день, как есть в начале месяца. Увеличение числа назначений должно возрастать с постоянной скоростью.

Так, например, если в первый день месяца есть 5 назначений, к концу месяца мы будем получать 10 встреч в день.

Встреча может происходить только в будние дни.

Есть ли достойный алгоритм, который поможет мне распределить эти даты таким образом?

Редактировать

Это лучшее, что я получил до сих пор, вдохновленный решение Henriks:

private int GetNumForCurrentDate (DateTime date) 
    { 
     int daysInMonth = DateTime.DaysInMonth (date.Year, date.Month); 

     // x is the number of appointments on the first day 
     double firstDay = this._NumPerMonth/(((ratio + 1)/2) * daysInMonth); 

     // x * ratio is the number of appointments on the last day. 
     double lastDay = firstDay * ratio; 

     // Interpolate a value between the first and last days 
     double exactNumOnThisDay = firstDay + (lastDay - firstDay) * ((double)date.Day/(double)daysInMonth); 
     int numOnThisDay = Convert.ToInt32 (Math.Truncate (exactNumOnThisDay)); 

     // Accumulate any overflow 
     this._Overflow += exactNumOnThisDay - numOnThisDay; 
     if (this._Overflow > 1) 
     { 
      // Shove the overflow into our number when it gets into whole number teritory 
      numOnThisDay++; 
      this._Overflow--; 
     } 

     return numOnThisDay; 
    } 

возвращает количество дней выделить на определенный день с учетом даты. Речь идет о разделении распределений на каждый месяц и обрабатывает округление переполнения, но его не совсем идеально, у него заканчиваются дни, чтобы выделить в последний день, но на данный момент это достаточно хорошо, и у меня заканчивается время, чтобы его совершенствовать ..

+0

«если есть 5 назначений в 1-й день месяца, то к концу месяца мы будем получать 10 назначений в месяц »--- Это в месяц или в день, поскольку вы заявляете это по-разному в разных местах вашего вопроса. Спасибо –

+0

Извините .. вопиющая опечатка! Я имею в виду 10 в день. Редактировал. Спасибо за обнаружение;) –

ответ

1

x встречи в первый день, 2x последний день, поэтому 1,5x в среднем. Когда есть дни недели, x равно 1000/(1.5y). Таким образом, 667/год в первый день, 1333/год на последнем, интерполировать в течение дней между

+0

Я думаю, вы забыли одно требование: «Увеличение назначений должно увеличиваться с постоянной скоростью (не линейно)». Это f '' (x) = c. Ваш f (x) = cx, f '(x) = c, f' '(x) = 0. –

+0

@ Томас: может быть, вы правы. Я неправильно понимаю «увеличение роста». – Henrik

+0

@ Томас: Но с этой интерпретацией проблема недоопределена, мое решение по-прежнему правильное, так как f '' = 0 = const. :) – Henrik

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