現在、特定の値を経時的に測定するソフトウェアを実装しています。ユーザーは、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 ポイントを少し近づける方法を知っている人はいますか?
最終的には、最初のポイントを少なくとも 1 分ほど離すアルゴリズムを追加する必要があることを理解しています。そのような動作を厳密に数学的アルゴリズムに組み込むことはできないからです。
このようなもの:
if (((int)tSpan.TotalMinutes) <= tLastPointMinute)
{
tSpan = new TimeSpan((tLastPointMinute +1) * 600000000L);
tRelativeLocation = tSpan.Ticks;
tLastPointMinute = (int)tSpan.TotalMinutes;
}
ただし、全体的にもう少し良い分布を得たいと思っています。
数学のひび割れからのクールなアイデアは大歓迎です!