代码之家  ›  专栏  ›  技术社区  ›  mafu

将输入随机移动到DOS for命令中的循环

  •  0
  • mafu  · 技术社区  · 6 年前

    在Windows命令行中,我使用的命令类似于

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

    有没有办法以随机顺序处理输入集(1,2,3)?结果可能是

    2
    3
    1
    

    任何一种伪随机排列对我来说也很好,它不必是“真正的”混乱。

    1 回复  |  直到 6 年前
        1
  •  1
  •   forTheLoveOfCode    6 年前

    这是我在这里的第一个答案,所以我们将看到它是如何发展的。

    我做了一些研究,没有找到任何专门用于将输入转换为for命令的内容,但是我发现您可以将输入存储在一个批处理数组中,并用它进行转换。然而,这确实意味着 没有使用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
    )
    

    第二个位实际上使用%随机%进行洗牌。我用过 this 作为参考的问题。

    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
    )
    

    我希望这有助于或者至少让你思考实现你所想的可能方法。