Как сделать рандомные числа в командной строке

Обновлено: 04.07.2024

Командная строка, батники\сценарии (bat, cmd)
( часть 1 ) ( часть 2 ) ( часть 3 ) ( часть 4 )
Вопросы, задачи и их решения по работе с командной строкой, файлами, а также сопутствующие ссылки.

Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно. Чтобы не копировались концевые пробелы из форума, жмите на ссылку "Редактировать" в посте, и уже из редактора копируйте батник без пробелов.

YuS_2
Я понимаю что можно "жонглировать" как я писал выше и получить разные ухищрения. И на SO есть не мало примеров. Наверное в ВАТ-е можно написать и свой енкриптор/декриптор, но зачем? Мне бы ехать а не шашечки в виде таких простыней cmd. Не зря же есть разные приложения для таких целей.
Но всё равно спасибо за ваш пример, никогда не будет лишним, особенно для тех кто будет искать примеры только в ВАТ-е без сторонних прог.

По поводу "ЧЯДНТ?"
Если знакомы с Perl-ом, выполните это (думаючто и в Python-е и во многих других средах для скриптов можно это сделать):

Поясню немного: Хоть Ваш вопрос про специализированный консольный софт и не оффтопик здесь, но всё же, эта тема больше про батники, сценарии и т.п., в общем про командную строку. И наверное, уже только в случае когда встроенных средств не хватает, по тем или иным причинам, вот тогда уже следует пытаться обращаться ко внешним средствам, в том числе и к приложениям, подобным тому, которое Вы ищете. Если же Вам требовалось только приложение, то надо было сразу так и написать. а лучше (если, конечно, у нас тут такая тема найдется) поискать на форуме более подходящую тему для поиска подобных приложений, имхо.

if "%~1" equ "" (set /a x=16) else (set /a x=%~1)
if "%~2" equ "" (set /a y=16) else (set /a y=%~2)
if %y% gtr 16 echo Параметр 2 ^(разрядность^) не может превышать ^
число символов, записанных в переменной chr&pause&exit /b

set "m=%x%" &: количество цифр в выводе
set "n=%y%" &: разрядность
set chr=0 1 2 3 4 5 6 7 8 9 A B C D E F &: символы используемые в выводе

Для создания псевдо-случайной строки можно использовать такой скрипт (JS):

Favorite

Добавить в избранное

Bash Heredoc

Ч исло, которое изменяется при каждом выполнении скрипта, называется случайным числом, и оно непредсказуемо. Случайные числа используются в программировании для различных целей, таких как тестирование данных, генерация лотерейных билетов, генерация пароля и т. д. Целое число или плавающее число можно использовать для генерации случайного числа в bash. Случайное число определенного диапазона или размера можно сгенерировать с помощью сценария bash. В этой статье были показаны различные способы генерации случайных чисел в bash.

Использование случайного генератора:

Случайное число или диапазон случайных чисел можно сгенерировать с помощью переменной $RANDOM. По умолчанию он генерирует случайное число от 0 до 32767. Но вы можете установить диапазон чисел для генерации случайных чисел, разделив значение $RANDOM на определенное значение. Различные варианты использования переменной $RANDOM для генерации случайных чисел показаны в следующей части статьи.

Генерация случайных чисел с использованием переменной $RANDOM:

Здесь показаны способы генерации случайного числа в терминале и выполнения файла сценария.

A. Генерация случайных чисел с терминала

Выполните следующую команду, чтобы сгенерировать случайное число в диапазоне от 0 до 32767.

Вы можете сгенерировать случайное число из определенного диапазона, разделив переменную $RANDOM на определенное значение и получив оставшееся значение. Выполните следующую команду, чтобы сгенерировать случайное число в диапазоне от 1 до 50. Здесь используются двойные первые скобки с символом $.

Выполните следующую команду, чтобы сгенерировать случайное число в диапазоне от 10 до 40. Здесь использовалась третья скобка с символом $.

Б. Генерация случайных чисел с помощью скрипта

Генерация случайных чисел с помощью команды shuf:

Использование команды `shuf` – еще один способ сгенерировать случайное число из определенного диапазона. В этой статьи были показаны способы генерации случайного числа из терминала и использования сценария.

A. Генерация случайных чисел с терминала

Выполните следующую команду, чтобы сгенерировать случайное число от 0 до 50 с помощью команды `shuf`.

Согласно следующему выводу, указанная выше команда была выполнена три раза, и были сгенерированы три случайных числа.

Б. Генерация случайных чисел с помощью скрипта

Создайте файл bash со следующим сценарием для создания списка случайных чисел на основе входного значения. Цикл for использовался для многократного выполнения команды`shuf`, чтобы сгенерировать список случайных чисел от 1 до 100 и распечатать числа.

Следующие выходные данные показывают, что 5 было принято в качестве входного значения и было сгенерировано 5 случайных чисел, которые не больше 100 и не меньше 1.

Генерация случайных чисел с помощью /dev/urandom:

/dev/urandom можно использовать с разными командами для генерации разных типов случайных значений. Его нельзя использовать для указания значений диапазона, таких как команда shuf и переменная $RANDOM. Но количество цифр случайного числа можно определить в команде с помощью /dev/urandom. Использование команды od с /dev/urandom показано в следующей части этого руководства. Эта команда может использоваться для указания количества байтов, где каждый байт может быть определен десятичным числом от 0 до 255.

Выполните следующую команду, чтобы сгенерировать случайное число от 0 до 255.

Выходные данные показывают, что указанная выше команда была выполнена три раза, и здесь были сгенерированы три разных случайных числа, значения которых не превышают 255.

Читать Проблемы с практикой Python. Приготовьтесь к следующему собеседованию. Решение головоломки судоку. Часть 4.1

Заключение:

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Выводит случайное число от 0 до 9.
У меня это число по нелепой псевдослучайности цифру секунды
%CD% - раскрывается в строку текущей директории.
%DATE% - раскрывается в текущую дату, используя тот же формат команды DATE.
%TIME% - раскрывается в текущую дату, используя формат команды TIME.
%ERRORLEVEL% - раскрывается в текущее значение ERRORLEVEL.
Уровень ошибки, 0 - это нет ошибки, 1 - это есть ошибка, а другие это номера ошибки.

Чтобы получить полный список переменных и их значений введите команду SET


Операции со строковыми или численными переменными

Соединение 2-ух строковых переменных

Вывод определенного(ых) символа(ов) из строки
Символы номеруются начиная с 0!

Существуют 2 способа использовать переменную в переменной, например: вывод n-ого символа

Первый способ с call set

писать в do
С циклами мы разберемся в следующей статье.
Но, пока уточню: если код второго способа юзать в пакетном файле (BATнике), то вместо %i юзаем %%i.


Операции с числовыми переменными

Увеличивание на единицу

Унарные операторы

Логическое отрицание (Logical NOT)

дает результат(%y%) 1 (True), если переменная(%x%) равна 0 (False), и 0 (False) (%y%) в любых других случаях

Побитовое И (AND)

Побитовое И — это бинарная операция, действие которой эквивалентно применению логического И к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов.
Другими словами, если оба соответствующих бита операндов равны 1, результирующий двоичный разряд равен 1; если же хотя бы один бит из пары равен 0, результирующий двоичный разряд равен 0.

Побитовое ИЛИ (OR)

Побитовое ИЛИ — это бинарная операция, действие которой эквивалентно применению логического ИЛИ к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов.
Другими словами, если оба соответствующих бита операндов равны 0, двоичный разряд результата равен 0; если же хотя бы один бит из пары равен 1, двоичный разряд результата равен 1.

Побитовое исключающее ИЛИ (XOR)

Побитовое исключающее ИЛИ (или побитовое сложение по модулю два) — это бинарная операция, действие которой эквивалентно применению логического исключающего ИЛИ к каждой паре битов, которые стоят на

одинаковых позициях в двоичных представлениях операндов.
Другими словами, если соответствующие биты операндов различны, то двоичный разряд результата равен 1; если же биты совпадают, то двоичный разряд результата равен 0.

К битовым операциям также относят битовые сдвиги. При сдвиге значения битов копируются в соседние по направлению сдвига.
Различают сдвиг влево (в направлении от младшего бита к старшему) и вправо (в направлении от старшего бита к младшему).
При логическом сдвиге значение последнего бита по направлению сдвига теряется (копируясь в бит переноса), а первый приобретает нулевое значение.

Двоичный арифметический сдвиг

Арифметический сдвиг аналогичен логическому, но значение слова считается знаковым числом, представленным в дополнительном коде.
Так, при правом сдвиге старший бит сохраняет свое значение. Левый арифметический сдвиг идентичен логическому.

Максимальный размер отдельной переменной среды составляет 8192 байта.(у меня выходило только 8184, наверное это вместе с названием. )
Максимальный общий размер всех переменных среды, включая имена переменных и знак равенства, составляет 65 536 Кбайт.

Системы счисления

Числовые значения рассматриваются как десятичные, если перед ними не стоит префикс 0x для шестнадцатеричных чисел, и 0 для восьмеричных чисел. Например, числа 0x12, и 022 обозначают десятичное число 18.

Обратите внимание на запись восьмеричных числе: 08 и 09 не являются допустимыми числами, так как в восьмеричной системе исчисления цифры 8 и 9 не используются.

Восьмеричная система счисления

Можно производить все операции, также как и с десятеричными числами.
Но после задания значения переменной, значение хранится в десятичной системе счисления.
Например, сложение


Сохранение в переменной вывода программы
К сожаление, передача вывода программ на вход команды set не работает:


Оператор == используется только для строчного сравнения. Кавычки необходимы если в переменной/операнде имеются пробелы.
Для арифметического сравнения необходимо использовать арифметические операторы:
EQU : Равно (=)
NEQ : Не равно (!=)
LSS : Меньше ( )
GEQ : Больше или равно (>=)
Использовать операторы, указанные в скобках, не представляется возможным, потому что, например, операторы являются указателями перенаправления ввода-вывода.

Dragokas

Very kind Developer

Var_Replacing.jpg

Ограничение - будет модифицирована переменная. Следует выбрать переменную, модификация которой не нарушит работу скрипта или использовать setlocal / endlocal.

Undocumented Dynamic variables (read only)

%__CD__% текущий каталог, с бэкслэшем '\' в хвосте;
%=C:% Текуший каталог на диске C:
%=D:% Текуший каталог на диске D:,E:,F. (буковку подставите), если к нему было обращение в текущем сеансе CMD.EXE
%=ExitCode% Шестнадцатеричное значение кода возврата по EXIT /B
%=ExitCodeAscii% Символьное (ASCII) представление кода возврата по EXIT /B, если он больше 32 (пробел).

Dragokas

Very kind Developer

Полезные функции

Мы знаем, что переменная %RANDOM% выводит значение в области от 0 до 32767,
а что если нам нужно диапазон уже, к примеру от -50 до 50? Вот решение:

Как известно в бат-файлах есть только операция целочисленного деления
и получения остатка от деления. Получить дробное число нельзя. Решил восполнить этот пробел:

Алгоритм получения дробной части:
Остаток от деления * (10^(знаков после запятой)) / делитель.
Потом убираются лишние концевые нули у дробной части.

Отличие от встроенного в CMD деления: исходное число (делимое) может превышать границу для числового типа данных CMD
(актуально для Гигабайтов данных, представленных в виде байтов, для дальнейшего перевода в более удобо-читаемую единицу измерения).

Принцип работы: если подстрока присутствует в строке, она будет удалена и результат не будет равен исходной строке.
Не работает с пустыми строками.

2. Вариант, когда подстрока тоже в переменной

Пример использования и функция:

Talory

Новый пользователь

Здравствуйте, не совсем понял про шестнадцатеричную систему. Мне надо день месяца, месяц и год вывести в шестьнадцатеричной системе. Как это будет выглядеть в bat?

Dragokas

Very kind Developer

О какой части статьи идёт речь?

Talory

Новый пользователь

Про системы счисления. Хочу через bat файл в реестре сделать изменения в значении файла. Необходимо внести нынешнию дату в шестьнадцатеричной системе

Dragokas

Very kind Developer

В общем случае, перевод с 10-СС в 16 будет через Batch выглядеть так:

JAXSWAGGER

Новый пользователь

Здравствуйте, а как я могу сделать, что бы система проверяла меньше ли числовая переменная определенного числа? Я не нашел данного в статье

Dragokas

Very kind Developer

IF [/I] строка1 оператор_сравнения строка2 команда

EQL - равно
NEQ - не равно
LSS - меньше
LEQ - меньше или равно
GTR - больше
GEQ - больше или равно,

JAXSWAGGER

Новый пользователь

Dragokas

Very kind Developer

Похоже, ошибка во встроенной документации.

Вместо EQL должно быть EQU
/i - не нужна т.к. у вас сравнение математическое, а не текстовое
Переменную нужно подавать в раскрытом виде:

Второй вариант с кавычками безопаснее, если сравниваете строки.

Переменную можно не раскрывать только в математических операциях при участии оператора set /a

m00slim25

Новый пользователь

Заметил несколько ошибок:

>> Логическое отрицание (Logical NOT)

дает результат (%y%) 1 (True), если переменная(%x%) равна 0 (False),
и 0 (False) (%y%) в любых других случаях

m00slim25

Новый пользователь

Оператор == используется только для строчного сравнения. Кавычки необходимы если в переменной/операнде имеются пробелы.
Для арифметического сравнения необходимо использовать арифметические операторы:
EQU : Равно (=)
NEQ : Не равно (!=)
LSS : Меньше ( )
GEQ : Больше или равно (>=)
Использовать операторы из скобок не представляется возможным, потому что, например, операторы являются указателями перенаправления ввода-вывода.

Dragokas

Very kind Developer

Спасибо за комментарии, дополнил.

m00slim25

Новый пользователь

При использовании нетривиальных вычислений. Например, в случае переполнения при использовании операторов битового сдвига. Эти операторы просто не определяют переполнение, вследствие чего последующая побитовая инверсия даёт ошибочный результат.

ЗЫ. Только не просите примеры, они где то далеко и глубоко закопаны Да Вы и сами можете исследовать эту особенность, это несложно
ЗЫЫ. Любой, кто использует вычисления подобного рода в командной оболочке, способен самостоятельно расследовать подобные инциденты, выявить причину ошибочных результатов, и принять меры, чтобы избежать этих инцидентов. Я привёл тот комментарий лишь для информативности: знание - сила. Можете игнорировать его, если он Вас каким-либо образом напрягает.

Dragokas

Very kind Developer

Да, верю. Я проверил побитовую инверсию на максимальных числах и у меня всё посчитало правильно.
Но если речь о битовых сдвигах, ещё и переполнении, то тогда всё понятно.

Покаполностью случайный, на самом деле невозможно, мы все еще можем иметь псевдослучайные числа на компьютерах.

Мы можем иметьобычныйпсевдослучайные числа икриптографически безопасныйпсевдослучайные числа.

Посмотрим, как это сделать в Go.

Псевдослучайные числа

В math/rand упаковкапредоставленный стандартной библиотекой Go дает намгенераторы псевдослучайных чисел (PRNG), также называемыйдетерминированные генераторы случайных битов.

Как и во всех генераторах псевдо-чисел, любое число, сгенерированное с помощью math/rand являетсяне совсем случайнопо умолчанию как детерминированныйон всегда будет печатать одно и то же значение каждый раз.

В качестве примера попробуйте запустить этот код, который вводит rand.Intn(n) , который возвращает случайное число между 0 и n - 1 .

Вы всегда будете видеть одну и ту же последовательность при каждом запуске программы. Случайное число меняется внутри программы, но каждый раз, когда вы ее запускаете, вы получаете один и тот же результат:

Это потому, что по умолчанию семя всегда одно и то же, число 1 . Чтобы действительно получить случайное число, вам нужно предоставить уникальноесемядля вашей программы. Вы действительно хотите не забыть о заполнении, а вместо этого правильно заполнить наш генератор псевдочумов. Как?

Использовать rand.Seed() перед звонком в любой math/rand метод, передавая int64 ценить. Вам просто нужно один раз засеять свою программу, а не каждый раз, когда вам нужно случайное число. Наиболее часто используемым начальным значением является текущее время, преобразованное в int64 кUnixNanoс rand.Seed(time.Now().UnixNano()) :

Помните, что из-за изолированности Go Playground всегда начинается с одного и того же времени, поэтому этот код не будет работать должным образом. Попробуйте это в реальной среде, и числа, которые раньше не менялись, теперь будут печататься по-разному при каждом запуске программы.

Некоторые распространенные примеры перечислены ниже для удобства повторного использования:

Читайте также: