Я пытаюсь сгенерировать некоторые тестовые данные.
Скажем, у меня есть 1000 встреч, которые мне нужно распределить по диапазону дат.
Теперь мне нужно распределить эти встречи так, чтобы в конце месяца было в два раза больше встреч в день, чем в начале месяца. Увеличение назначений должно увеличиваться с постоянной скоростью.
Так, например, если в 1-й день месяца будет 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;
}
Возвращает количество дней, выделяемых на определенный день с учетом даты.
Он имеет дело с разделением распределений на каждый месяц и обрабатывает переполнение при округлении, но это не совсем идеально, у него заканчиваются дни для распределения в последний день, но на данный момент это достаточно хорошо, и у меня заканчивается время для его совершенствования. .