Перемешать ввод в цикл в DOS для команды - PullRequest
0 голосов
/ 17 сентября 2018

В командной строке Windows я использую команду, аналогичную

for %x in (1 2 3) do echo %x

Есть ли способ работы с входным набором (1, 2, 3) в случайном порядке? Так что результат может быть

2
3
1

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

1 Ответ

0 голосов
/ 17 сентября 2018

Это мой первый ответ здесь, так что посмотрим, как он пойдет.

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

Вот код, который я использовал для создания перемешанного массива:

@echo off
setlocal enabledelayedexpansion
set inputVars[0]=1
set inputVars[1]=2
set inputVars[2]=3
set inputVars[3]=4
set inputVars[4]=5

set /A inputsLength=0

:lengthLoop
if defined inputVars[%inputsLength%] (
    set /A inputsLength+=1
    goto :lengthLoop
)

set /A currentIndex=0

:loop
    set /A randIndex=%RANDOM% %%%inputsLength%

    set temp=!inputVars[%currentIndex%]!
    set inputVars[%currentIndex%]=!inputVars[%randIndex%]!
    set inputVars[%randIndex%]=%temp%

    set /A currentIndex+=1

if currentIndex LSS %inputsLength% (
    goto :loop
)

set /A currentIndex=0

:outputLoop
if defined inputVars[%currentIndex%] (
    echo !inputVars[%currentIndex%]!
    set /A currentIndex+=1
    goto :outputLoop
)

endlocal

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

set /A inputsLength=0

:lengthLoop
if defined inputVars[%inputsLength%] (
    set /A inputsLength+=1
    goto :lengthLoop
)

Второй бит фактически выполняет перетасовку, используя% RANDOM%. Я использовал этот вопрос в качестве ссылки для этого.

set /A currentIndex=0

:loop
    set /A randIndex=%RANDOM% %%%inputsLength%

    set temp=!inputVars[%currentIndex%]!
    set inputVars[%currentIndex%]=!inputVars[%randIndex%]!
    set inputVars[%randIndex%]=%temp%

    set /A currentIndex+=1

if currentIndex LSS %inputsLength% (
    goto :loop
)

Последний бит кода фактически выполняет итерации по массиву, поэтому для выполнения этой операции команда for была заменена .

set /A currentIndex=0

:outputLoop
if defined inputVars[%currentIndex%] (
    echo !inputVars[%currentIndex%]!
    set /A currentIndex+=1
    goto :outputLoop
)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...