Генератор случайных чисел не случайный в пакетном файле - PullRequest
0 голосов
/ 31 мая 2019

Попытка сгенерировать случайное число и использовать его для значения переменной в файле пакетного сценария Windows. Может быть, я упускаю что-то очень простое, но что-то здесь не работает для меня.

Создан командный файл с именем random_test.bat со следующим содержимым.

SET rnumber=%random%
echo %random%
pause

Запуск файла три раза подряд приводит к следующему набору выходных данных:

One

C:\Users\user\Desktop>SET rnumber=28955

C:\Users\user\Desktop>echo 20160
20160

C:\Users\user\Desktop>pause
Press any key to continue . . .

Два

C:\Users\user\Desktop>SET rnumber=29072

C:\Users\user\Desktop>echo 13887
13887

C:\Users\user\Desktop>pause
Press any key to continue . . .

Три

C:\Users\user\Desktop>SET rnumber=29183

C:\Users\user\Desktop>echo 18885
18885

C:\Users\user\Desktop>pause
Press any key to continue . . .

Как видите, команда echo %random% продолжает генерировать относительно случайные числа от 0 до 32 767, как и ожидалось.

В то же время использование %random% для установки значения для переменной rnumber не позволяет. Он выдает не очень случайное число (возможно, тоже от 0 до 32 767), но это не случайное число. Если бы я догадался прямо сейчас, похоже, что он медленно растет в направлении от 0 до 32 767.

Чтобы уточнить, сценарий продолжает генерировать случайное число со строкой 2 при каждом выполнении (20160, 13887, 18885 ...), но строка 1, кажется, производит число, которое продолжает увеличиваться с каждым выполнением пакетного файла (28955, 29072, 29183 и т. Д. В нескольких тестах).

Я уже пробовал это на двух разных компьютерах, Windows 7 x64 и Windows 2012 R2, соответственно, запустив этот трехстрочный сценарий несколько раз подряд.

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

Что здесь происходит?

UPDATE:

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

  • Строка в скрипте echo %random% работает как положено.
  • Строка SET rnumber=%random% отсутствует.

(при выполнении одного и того же скрипта несколько раз)

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

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

Генератор случайных чисел в пакетном скрипте использует следующий алгоритм для заполнения начального значения случайного числа, когдановое окно CMD открывается.(отсюда - https://devblogs.microsoft.com/oldnewthing/?p=13673)

srand((unsigned)time(NULL));

В результате, когда два (или более) окна CMD запускаются в одну и ту же секунду, начальные возвраты% random% совпадают. Последующие возвраты% random% в двух окнах CMD с одинаковым начальным числом и временем выполнения (с точностью до секунды) также одинаковы.

Более того, если окна CMD, следовательно, запускаются с определенными задержками друг от друга, первый возврат псевдо% random%переменная в каждом новом окне CMD будет далеко не случайной и будет медленно увеличиваться (диапазон от 0 до 32767). В моем тестировании это начальное число семян увеличивается на 3 или 4 каждую секунду для каждого нового окна.

Чтобы узнать больше об этом и найти обходные пути, посмотрите здесь:

Также посмотрите на обходной путь PowerShell, предоставленный @ lit.

0 голосов
/ 01 июня 2019

Случайные числа из cmd.exe не для слабонервных.Ни% RANDOM%, ни! RANDOM!доставит вас туда.

Эта страница, https://ss64.com/nt/syntax-random.html,, предназначена для интересного чтения.

Если вы работаете на поддерживаемой платформе Windows, PowerShell будет работать.

@ECHO OFF
FOR /F %%n IN ('powershell -NoLogo -NoProfile -Command Get-Random') DO (
    SET "RNUM=%%~n"
)
ECHO RNUM is %RNUM%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...