我目前正在实施一个软件,可以随着时间的推移测量某些值。用户可以选择在 28 天的时间内测量该值 100 次。(只是举个例子)
线性分布不是问题,但我目前正在尝试在时间跨度上获得点的对数分布。
直接的实现是迭代这些点,因此我需要一个指数函数。(我已经走到这一步了!)
我当前的算法(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;
}
但是,我希望总体上获得更好的分布。
任何来自你数学裂缝的很酷的想法都将不胜感激!