Это чисто пакетное решение без каких-либо VBS, JScript или PowerShell, но настоятельно рекомендуется просто избегать использования cmd с неприятными унаследованными вещами и просто использовать PowerShell
Почему% случайный% Windows время и как получить реальное случайное число?
%random%
- это специальная переменная в cmd.exe. Он не имеет ничего общего с Windows. Он засеян известным классом c srand((unsigned)time(NULL));
1 , как и большинство наивных / простых C или C ++ кодов, поэтому он не может обеспечить правильные случайные последовательности, если все они начинаются в одну секунду (что разрешение функции time()
). Есть так много связанных проблем:
Распространенным решением является использование значения времени высокого разрешения, такого как наносекунда. Это все еще «основано на времени», но почти все случайные числа являются псевдослучайными и засеваются со временем, подобным этому. Нет другого хорошего способа получить другое семя, которое меняется каждый раз. Вы никогда не сможете получить действительное случайное число в компьютерах без реального источника энтропии
Вы можете сделать подобный обходной путь, изменив значение с точностью до секунды: set /a "num=(%random% ^ %time:~-2%) %% 1000 + 3000"
. Или получите миллисекунду как это
for /F "usebackq tokens=2 delims==" %%i in (
`wmic os get LocalDateTime /VALUE`
) do @set ctime=%%i
set /a "num=(%random% ^ %ctime:~15,3%) %% 1000 + 3000"
Для лучших результатов некоторые программы объединяют время с идентификатором процесса, чтобы ни у двух процессов не было одинакового начального числа. Вы также можете сделать это
for /f "usebackq tokens=2 delims==; " %%a in (
`wmic process call create '"cmd.exe" "/c exit"' ^| find "ProcessId"`
) do @set PID=%%a
for /F "usebackq tokens=2 delims==" %%i in (
`wmic os get LocalDateTime /VALUE`
) do @set ctime=%%i
set /a "num=(%random% + %ctime:~15,3%*31 ^ %PID%) %% 1000 + 3000"
Здесь вместо текущего PID используется PID ребенка, но для этой цели он такой же
1 Как бы случайно я ни был: почему cmd.exe% RANDOM% не такой случайный