Безвыходное положение

Не пьянеющий:
– Ребята, положение безвыходное.

– Что такое.
– Почему?

Не пьянеющий:
– За Глину Борисовну надо выпить.

Алкашин:
– За какую Галину Борисовну?

Не пьянеющий:
– За Галину Борисовну Волчек. Или есть ещё какая-нибудь Галина Борисовна?

Павлик:
– Ребята, мне уже хватит. Иначе я на аэродром не попадаю.

Не пьянеющий:
– Дай мне свой билет. Положись на меня. Я никогда не пьянею.
 
Алкашин:
– Ребята! У меня родился тост. Давайте выпьем за всех, кто умер от короновируса. За всех людей на Земле.

Фокс:
– Хороший тост.

Не пьянеющий:
– И как это я сам раньше не догадался?

Павлик:
– Ребята, только по-быстрому. Иначе я опаздываю на аэродром. Мне Ирка этого не простит…



А потом выпили и за Марка Анатольевича Захарова. И за 14 июля – день взятия Бастилии. А уж за 15 июля – день дуэли между Лермонтовым и Мартыновым просто было грех не выпить!



P.S.

Ну, вот, в принципе. Что я хотел вам сказать… Дай Бог памяти… Ах, да. В записке «Двигаем фишки» я привёл командник, для эмуляции игрального кубика. Там проблема: повторяемость значений. Давайте рассмотрим её, и решим как быть?

Рассмотрим строчку:
SET /A MAN1=%/5461+1

% - заменяется случайным десятичным числом в диапазоне от 0 до 32767.

Таким образом, если мы возьмём весь диапазон от 0 до 32767 и разделим его на шесть равных отрезков, то получим: 5461,166666666667 . Но так как значения переменных окружения в командных файлах имеют лишь ЦЕЛЫЕ значения, то наше число будет равно: 5461 . Получается, что разделив весь диапазон на шесть равных частей равных 5461, мы при получении нового числа % будем проверять его на принадлежность к какому-либо промежутку. Так, при значении % от 0 до 5460 – результат будет равен 0 (нулюЁ!). А при всех возможных значениях он будет равен любому значению от 0 до 5. Прибавим 1. Получим множество значений от 1 до 6. Как раз то, что нам нужно!

Но!

Очень может быть, что следующее значение % попадёт в тот же интервал. И тогда очередное значение будет повторять предыдущее. – В этом проблема.

Я предложил повторить строку:
SET /A MAN1=%/5461+1

столько раз, сколько не жалко. И не накладно. И тогда, вероятность того, что каждое пятое, десятое или двадцатое значение будет принадлежать тому же промежутку, что и первое – уменьшается. И повторы сходят на нет.

Но!

Можно модифицировать эту ключевую строку, и заменить её на две:
SET MAN0=%
SET /A MAN1=MAN0-((MAN0/6)*6)+1

В этом случае по правилу целочисленной арифметики ((MAN0/6)*6) будет определением ЦЕЛОГО от деления на ШЕСТЬ. (Дробная часть будет потеряна). Соответственно разница между исходным числом и ЦЕЛЫМ от деления на ШЕСТЬ (называется, деление по модулю ШЕСТЬ) выделит для нас остаток. А он будет лежать в пределах от 0 до 5. Прибавив снова 1, мы получим нужные нам значения от 1 до 6.

Но!

Теперь они уже не будут зависеть от близости значений %. Даже если значения переменной % будут отличаться всего лишь на 1, то и в этом случае разница вычисленных значений будет существенна.

Вот так.


Пример:

% = 32000
SET MAN0=32000
SET /A MAN1=MAN0-((MAN0/6)*6)+1=3

и

% = 32001
SET MAN0=32001
SET /A MAN1=MAN0-((MAN0/6)*6)+1=4

Таким образом, мы ушли от повторяемости значений!



А можно использовать специальный оператор "%" - он находит остаток от деления нацело по указанному модулю! И тогда строка SET /A MAN1=%/5461+1 будет выглядеть совсем по другому:

SET /A MAN1=%+1

И повторяемость ушла, и лишняя переменная, и строка стала короче некуда. Вот только написать нужно хитрее. Из командной строки эта строка будет работать. А внутри командного файла нет. Почему? Потому что запись  воспринимается внутри командного файла, как указание на ШЕСТОЙ ПАРАМЕТР из строки вызова командного файла! А что же делать? Нужно добавить ещё один прОцент. Вот так:

SET /A MAN1=%%+1

И сразу всё заработает.



Ё-моё! И все дела.

Алес.





P.P.S.

Кстати, перменная % возвращает время и с секундами, и с десятыми долями, и даже с сотыми! Если нужно ТОЧНОЕ измерение времени в командном файле, нужно использовать не команду TIME /T, а переменную %

Например:
>echo %
12:01:37,95

То есть много чего есть, но так слабо документировано! Что горе всякому, кто будет полагаться на HELP. Явно, фирма делала всё не для себя. А вам, горе-покупатели, оставили только право платить, а все подробности забрали себе. Обегорили, короче говоря.

Вот и надейтесь после этого на них. Кинут. – Глазом не моргнут.





18:47:56 13.07.2020          A32B743986C0


Рецензии