Перейти к основному содержимому

Счётчики — increment и decrement

Когда брать. Нужен сквозной счётчик вместо случайного значения — последовательный id или номер строки (1, 2, 3…), серия артикулов, растущая с фиксированным шагом, или обратный отсчёт до нуля.

Оба генератора живут внутри <sequence>: последовательность один раз вычисляется как массив, а каждая строка вывода берёт следующее значение через интерполяцию ${{Имя}}.

Кратко

АтрибутПрименяется кПо умолчаниюЧто делает
valueincrement, decrement0Стартовое значение
stepincrement, decrement1На сколько прибавлять или вычитать каждую строку

Оба счётчика привязаны к позиции и детерминированы: каждая строка просто берёт следующее значение прогона. Они полностью игнорируют seed (в отличие от случайных генераторов), поэтому последовательность одинакова при каждом запуске — выводы на этой странице точные, а не просто иллюстративные.

increment — возрастающий счётчик

Каждая строка — это предыдущее значение плюс step. С настройками по умолчанию (value="0", step="1") счётчик растёт на единицу, но чаще всего нужна колонка id, стартующая с 1.

<sequence name="Id"><gen type="increment" value="1"/></sequence>
./run demo.tdc (count=5)
1
2
3
4
5

Берите его всегда, когда нужен стабильный сквозной id или номер строки — каждая карточка получает свой уникальный последовательный номер, и это воспроизводимо между запусками.

decrement — убывающий счётчик

Каждая строка — это предыдущее значение минус step. Те же два атрибута, меняется только направление.

<sequence name="Countdown"><gen type="decrement" value="100"/></sequence>
./run demo.tdc (count=5)
100
99
98
97
96

Берите decrement, когда нужен обратный отсчёт, колонка остатка или любая обратная нумерация, которая стартует высоко и идёт вниз.

step — шаг

step задаёт, на сколько счётчик сдвигается между строками. По умолчанию — 1. Направьте одинаковый старт (value="1") на два разных шага, и единственное различие — величина шага: слева счёт идёт по одному, справа — по пять:

<sequence name="ByOne"><gen type="increment" value="1"/></sequence>
<sequence name="ByFive"><gen type="increment" value="1" step="5"/></sequence>
...
<data>${{ByOne}} ${{ByFive}}</data>
./run demo.tdc (count=6)
step=1   step=5
1        1
2        6
3        11
4        16
5        21
6        26

С decrement step работает так же — он задаёт, насколько велик каждый шаг вниз:

<sequence name="Full"><gen type="decrement" value="1000"/></sequence>
<sequence name="ByHundred"><gen type="decrement" value="1000" step="100"/></sequence>
./run demo.tdc (count=5)
step=1   step=100
1000     1000
999      900
998      800
997      700
996      600

Задавайте свой step для серий, которые идут не по одному: артикулы с шагом 5, цена, падающая на фиксированную величину, шкала с делениями по десять.

Дробный шаг

step (как и value) принимает вещественное число, а не только целое — удобно для цен, процентов и любых измеряемых величин, которые меняются дробно:

<sequence name="Price"><gen type="decrement" value="9.99" step="0.50"/></sequence>
./run demo.tdc (count=5)
9.99
9.49
8.99
8.49
7.99

Детерминирован по своей природе

Счётчики никогда не обращаются к случайному движку, поэтому одна и та же конфигурация даёт один и тот же прогон независимо от seed. Два запуска с разными сидами дают побайтово одинаковые колонки счётчиков:

<gen type="increment" value="1" step="10"/>
./run demo.tdc — seed=alpha vs seed=omega (count=5)
seed=alpha   seed=omega
1            1
11           11
21           21
31           31
41           41

Именно поэтому счётчики — надёжный каркас набора данных: колонки id и номера строк остаются на месте, даже когда вы перетасовываете всё случайное вокруг них.

Нужен только номер строки?

Если всё, что нужно, — это текущий номер строки прямо в шаблоне вывода, есть встроенный ${{_count}} — последовательность не требуется. Он стартует с 1 и растёт на единицу с каждой записью.

Берите последовательность increment, когда счётчик нужен как именованное значение — чтобы переиспользовать его в нескольких местах, оформить маской, начать не с 1 или двигаться шагом, отличным от 1.

Смотрите также