В настоящее время я внедряю программное обеспечение, которое измеряет определенные значения с течением времени.Пользователь может выбрать измерение 100 раз в течение 28 дней.(Просто для примера)
Линейное распределение не является проблемой, но в настоящее время я пытаюсь получить логарифмическое распределение точек за промежуток времени.
Прямая реализация будет заключаться в итерации по точкам, и поэтому мне понадобится экспоненциальная функция.(Я дошел до этого!)
Мой текущий алгоритм (C #) выглядит следующим образом:
long tRelativeLocation = 0;
double tValue;
double tBase = PhaseTimeSpan.Ticks;
int tLastPointMinute = 0;
TimeSpan tSpan;
for (int i = 0; i < NumberOfPoints; i++)
{
tValue = Math.Log(i + 1, NumberOfPoints);
tValue = Math.Pow(tBase, tValue);
tRelativeLocation = (long)tValue;
tSpan = new TimeSpan(tRelativeLocation);
tCurrentPoint = new DefaultMeasuringPointTemplate(tRelativeLocation);
tPoints.Add(tCurrentPoint);
}
это дает мне довольно «хороший» результат за 28 дней и 100 баллов.
Первые 11 точек - в 0 секунд,
12-й пункт в 1 секунду,
20-й в 50 секунд,
50-й в 390 минут,
95-й в 28605 минут
99в 37697 минут (что составляет 43 часа до последней точки)
Мой вопрос: есть ли у кого-нибудь хорошая идея, как получить первые 20-30 очков дальше друг от друга, возможно, получить последние20-30 немного ближе друг к другу?
Я понимаю, что в конечном итоге мне придется добавить некоторый алгоритм, который устанавливает первые точки на расстоянии как минимум на одну минуту, потому что я не смогу получить такой видповедения в строго математический алгоритм.
Примерно так:
if (((int)tSpan.TotalMinutes) <= tLastPointMinute)
{
tSpan = new TimeSpan((tLastPointMinute +1) * 600000000L);
tRelativeLocation = tSpan.Ticks;
tLastPointMinute = (int)tSpan.TotalMinutes;
}
Однако я бы хотел получить немного лучший дистрибутив в целом.
Буду очень признателен за любые крутые идеи от вашей математики!