Нелинейный счетчик - PullRequest
       33

Нелинейный счетчик

1 голос
/ 09 марта 2010

Итак, у меня есть счетчик. Предполагается рассчитать текущую сумму чего-либо. Чтобы вычислить это, я знаю дату начала и начальную сумму, а также сумму, на которую счетчик увеличивается на каждую секунду. Очень просто. Сложность в том, что рост не совсем линейный. Каждый день сумма приращения увеличивается на установленную сумму. Мне нужно воссоздать это алгоритмически - по сути, выяснить точное значение на текущую дату на основе начального значения, суммы, увеличенной с течением времени, и суммы, на которую увеличился с течением времени.

Мой целевой язык - Javascript, но псевдокод тоже подойдет.

На основании решения AB:

var now = new Date();

var startDate1 = new Date("January 1 2010");
var days1 = (now - startDate1) / 1000 / 60 / 60 / 24;
var startNumber1 = 9344747520;
var startIncrement1 = 463;
var dailyIncrementAdjustment1 = .506;
var currentIncrement = startIncrement1 + (dailyIncrementAdjustment1 * days1);

startNumber1 = startNumber1 + (days1 / 2) * (2 * startIncrement1 + (days1 - 1) * dailyIncrementAdjustment1);

Вам это кажется разумным, ребята?

Ответы [ 3 ]

2 голосов
/ 09 марта 2010

Это квадратичная функция. Если t - это пройденное время, то оно обычно составляет 2 + bt + c, и вы можете вычислить a,b,c, подставив результаты на первые 3 секунды.

Или: используйте формулу для арифметической прогрессии суммы, где a1 - начальное приращение, а d - "установленная сумма", на которую вы ссылаетесь. Только не забудьте добавить свою «начальную сумму» к тому, что дает формула.

Если x 0 - начальная сумма, d - начальное приращение, а e - «установленная величина», чтобы увеличить возрастание, это означает, что x 0 + (t / 2) * (2d + (t-1) * e)

1 голос
/ 09 марта 2010

Если я правильно понимаю ваш вопрос, у вас есть начальное значение x_0, начальное приращение в секунду d_0 и корректировка приращения e в день. То есть в первый день приращение в секунду составляет d_0, во второй день приращение в секунду составляет d_0 + e и т. Д.

Затем отметим, что приращение в секунду во время t равно

d(t) = d_0 + floor(t / S) * e

, где S - количество секунд в день, а t - количество секунд, прошедших с t = t_0. Тогда

x = x_0 + sum_{k < floor(t / S)} S * d(k) + S * (t / S - floor(t / S)) * d(t)

- это формула, которую вы ищете. Отсюда вы можете упростить это до

x = x_0 + S * floor(t / S) d_0 + S * e * (floor(t / S) - 1) * floor(t / S) / 2.
0 голосов
/ 09 марта 2010
use strict; use warnings;

my $start = 0;
my $stop = 100;
my $current = $start;

for my $day ( 1 ..  100 ) {
    $current += ($day / 10);
    last unless $current < $stop;
    printf "Day: %d\tLeft %.2f\n", $day, (1 - $current/$stop);
}

Выход:

Day: 1  Left 1.00
Day: 2  Left 1.00
Day: 3  Left 0.99
Day: 4  Left 0.99
Day: 5  Left 0.98
...
Day: 42 Left 0.10
Day: 43 Left 0.05
Day: 44 Left 0.01
...