【问题标题】:How to use random in BATCH script?如何在 BATCH 脚本中使用随机数?
【发布时间】:2011-08-12 06:05:48
【问题描述】:

如何在 BATCH 脚本中使用随机数?

【问题讨论】:

  • 为什么要专门批量做这个?
  • 有一个非常有趣的post on SuperUser与批处理脚本中的随机数相关,值得在这里参考...

标签: windows random windows-xp batch-file


【解决方案1】:
@echo off & setLocal EnableDelayedExpansion

for /L %%a in (1 1 100) do (
echo !random!
)

【讨论】:

    【解决方案2】:

    %RANDOM% 给你一个 0 到 32767 之间的随机数。

    使用 SET /A test=%RANDOM% * 100 / 32768 + 1 之类的表达式,您可以将范围更改为您喜欢的任何值(这里的范围是 [1…100] 而不是 [0…32767])。

    【讨论】:

    • 鉴于具体问题,您很可能会使用某种循环?那么你确实应该使用延迟扩展,例如通过SETLOCAL ENABLEDELAYEDEXPANSION 并使用!RANDOM! 而不是%RANDOM%,就像Eugene 发布的那样。
    • 更一般的表达是%RANDOM% * (%maxval% - %minval% + 1) / 32768 + %minval%;只需先将minvalmaxval 设置为适当的值。
    【解决方案3】:

    您可能希望获得多个随机数,并且可能希望能够为每个随机数指定不同的范围,因此您应该定义一个函数。在我的示例中,我使用call:rand 25 30 生成从 25 到 30 的数字。函数退出后,结果在RAND_NUM

    @echo off & setlocal EnableDelayedExpansion
    
    for /L %%a in (1 1 10) do (
            call:rand 25 30
            echo !RAND_NUM!
    )
    
    goto:EOF
    
    REM The script ends at the above goto:EOF.  The following are functions.
    
    REM rand()
    REM Input: %1 is min, %2 is max.
    REM Output: RAND_NUM is set to a random number from min through max.
    :rand
    SET /A RAND_NUM=%RANDOM% * (%2 - %1 + 1) / 32768 + %1
    goto:EOF
    

    【讨论】:

    • 谢谢,工作得很好:如果 for /L %%a in (1 1 %3 ') do call:rand %1 %2
    【解决方案4】:

    %RANDOM% 为您提供 0 到 32767 之间的随机数。

    您可以通过以下方式控制数字的范围:

    set /a num=%random% %%100
    

    - 将产生 0~99 之间的数字。

    这个:

    set /a num=%random% %%100 +1
    

    - 将产生 1~100 之间的数字。

    【讨论】:

    • 请注意,这不会是均匀分布的!以 0~99 为例,数字 0~67 比数字 68~99 出现的频率略高,因为 32767 模 100 是 67 而不是 0,因为它必须是均匀分布。 (这个%random% %%100 不是神奇的语法,但实际上%random % %% 100 少了一个空格,其中%% 只是一个转义的%,它代表模数。)
    • 在 Windows 10 上尝试此操作时出现“缺少操作数”错误。看起来您只需要一个 % 即可。
    • @Calmarius 如果您在命令行上使用它,那么您需要 1%。在 .BAT 文件中需要 2。这是因为在 .BAT 文件中,%100 具有特殊含义,即使用参数执行时 .bat 文件的第 100 个参数。
    • @IkeStarnes 实际上 Batch 只能访问到 %9 的参数; %100 表示 %1 后缀两个零。
    【解决方案5】:
    set /a number=%random% %% [maximum]-[minimum]
    

    示例“

    set /a number=%random% %% 100-50
    

    将给出一个介于 100 和 50 之间的随机数。如果您不在批处理脚本中使用该行,请确保只使用一个百分号作为操作数!

    【讨论】:

    • 在 Windows 10 上,它应该提供从 -50 到 49 的数字。它真的有其他的吗?
    【解决方案6】:
    @echo off
    title Professional Hacker
    color 02
    :matrix
    echo %random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%
    echo %random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%% 
    echo %random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%
    echo %random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%
    echo %random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%
    echo %random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%
    echo %random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%% 
    echo %random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%% 
    goto matrix
    

    【讨论】:

    • 给它一些空格,让它有线条,比如@echo off
    【解决方案7】:

    你可以这样做,不需要EnableDelayedExpansion

    :choosenamea
    cls
    set /a choosemname=%random%
    
    if %choosemname% GTR %max% goto choosenameb
    if %choosemname% LSS %min% goto choosenameb
    goto gotnamenow
    

    max 是您的最大值,min 是您的最小值。这不是很有效,因为如果你的范围太小,可能需要很多轮。此外,这不适用于大于 32767 的数字。

    【讨论】:

      【解决方案8】:

      假设您想要一个数字 1-5;您可以使用以下内容:

          :LOOP
          set NUM=%random:~-1,1%
          if %NUM% GTR 5 (
          goto LOOP )
          goto NEXT
      

      或者您可以使用 :~1,1 代替 :~-1,1。 :~-1,1 不是必需的,但它大大减少了达到正确范围所需的时间。假设您想要一个 1-50 的数字,我们需要在 2 位和 1 位之间做出决定。使用:

          :LOOP
          set RAN1=%random:~-1,1%
          if %RAN1% GTR 5 (
          goto 1 )
          if %RAN1%==5 (
          goto LOOP )
          goto 2
      
          :1
          set NUM=%random:~-1,1%
          goto NEXT
      
          :2
          set NUM=%random:~-1,2%
          goto NEXT
      

      您可以在此算法中添加更多内容以在较大的范围之间做出决定,例如 1-1000。

      【讨论】:

      • 当你可以有一个像上面这样的衬垫时,你为什么要使用goto?其他解决方案让您明确指定范围。你的代码有什么优势?
      【解决方案9】:
      @(IF not "%1" == "max" (start /MAX cmd /Q /C %0 max&X)ELSE set C=1&set D=2&wmic process where name="cmd.exe" CALL setpriority "REALTIME">NUL)&CLS
      :Y
      title %random%6%random%%random%%random%%random%9%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%&color %D%&ECHO %random%%C%%random%%random%%random%%random%6%random%9%random%%random%%random%%random%%random%%random%%random%%random%%random%&(IF %C% EQU 46 (TIMEOUT /T 1 /NOBREAK>nul&set C=1&CLS&IF %D% EQU 9 (set D=1)ELSE set /A D=%D%+1)ELSE set /A C=%C%+1)&goto Y
      

      使用多个 IF 语句和大量 ((())) 进行简化

      【讨论】:

        【解决方案10】:

        现在具有 dos 彩虹的所有颜色

        @(IF not "%1" == "max" (start /MAX cmd /Q /C %0 max&X)
          ELSE set C=1&set D=A&wmic process where name="cmd.exe" CALL setpriority "REALTIME">NUL)&CLS
        :Y
        set V=%D%
        
        (IF %V% EQU 10 set V=A) 
            & (IF %V% EQU 11 set V=B)
            & (IF %V% EQU 12 set V=C)
            & (IF %V% EQU 13 set V=D) 
            & (IF %V% EQU 14 set V=E)
            & (IF %V% EQU 15 set V=F)
        title %random%6%random%%random%%random%%random%9%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%&color %V%&ECHO %random%%C%%random%%random%%random%%random%6%random%9%random%%random%%random%%random%%random%%random%%random%%random%%random%
        &(IF %C% EQU 46 (TIMEOUT /T 1 /NOBREAK>nul&set C=1&CLS&IF %D% EQU 15 (set D=1)ELSE set /A D=%D%+1)
          ELSE set /A C=%C%+1)&goto Y
        

        【讨论】:

        • 我认为那是坏的
        【解决方案11】:

        只是为了完全随机,完全没有秩序:SET /A V=%random% %%15 +1

        @(IF not "%1" == "max" (start /MAX cmd /Q /C %0 max&X)ELSE set C=1&set V=A&wmic process where name="cmd.exe" CALL setpriority "REALTIME">NUL)&CLS
        :Y
        (IF %V% EQU 10 set V=A)&(IF %V% EQU 11 set V=B)&(IF %V% EQU 12 set V=C)&(IF %V% EQU 13 set V=D)&(IF %V% EQU 14 set V=E)&(IF %V% EQU 15 set V=F)
        title %V%%random%6%random%%random%%random%%random%9%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%&color %V%&ECHO %random%%C%%random%%random%%random%%random%6%random%9%random%%random%%random%%random%%random%%random%%random%%random%%random%&(IF %C% EQU 46 (TIMEOUT /T 1 /NOBREAK>nul&set C=1&CLS&SET /A V=%random% %%15 +1)ELSE set /A C=%C%+1)&goto Y
        

        【讨论】:

          【解决方案12】:

          对于那些不总是想要黑屏的人来说,这是完全随机的。

          @(IF not "%1" == "max" (start /MAX cmd /Q /C %0 max&X)ELSE set A=0&set C=1&set V=A&wmic process where name="cmd.exe" CALL setpriority "REALTIME">NUL)&CLS
          :Y
          (IF %A% EQU 10 set A=A)&(IF %A% EQU 11 set A=B)&(IF %A% EQU 12 set A=C)&(IF %A% EQU 13 set A=D)&(IF %A% EQU 14 set A=E)&(IF %A% EQU 15 set A=F)
          (IF %V% EQU 10 set V=A)&(IF %V% EQU 11 set V=B)&(IF %V% EQU 12 set V=C)&(IF %V% EQU 13 set V=D)&(IF %V% EQU 14 set V=E)&(IF %V% EQU 15 set V=F)
          (IF %A% EQU %V% set A=0)
          title %A%%V%%random%6%random%%random%%random%%random%9%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%%random%&color %A%%V%&ECHO %random%%C%%random%%random%%random%%random%6%random%9%random%%random%%random%%random%%random%%random%%random%%random%%random%&(IF %C% EQU 46 (TIMEOUT /T 1 /NOBREAK>nul&set C=1&CLS&SET /A A=%random% %%15 +1&SET /A V=%random% %%15 +1)ELSE set /A C=%C%+1)&goto Y
          

          这会改变屏幕颜色,而且都是随机的。

          【讨论】:

            【解决方案13】:

            这是我为您创建的示例,它应该显示一个对话框,要求您选择一个数字 1-10,根据您选择的数字,它会为您命名的批处理文件生成一个随机数示例。如果您选择“1”,那么您将获得一个随机的 1 位数字示例。如果您选择“10”,那么您将获得一个随机的 10 位数字示例。

            @echo off
            color f0
            set /p "FileName= Enter Filename (Without Extension) : "
            echo @echo off >> %FileName%.bat
            echo File Created!
            pause
            cls
            :CommandLine
            set /p "calc= ~%ComputerName%: Enter a number to recieve the amount of  random digits :"
            if %calc%==genrand_help goto GenerateRandomHelp
            if %calc%==1 echo echo %%RANDOM:~-1%% >> %FileName%.bat
            if %calc%==2 echo echo %%RANDOM:~-1%%%%RANDOM:~-1%% >> %FileName%.bat 
            if %calc%==3 echo echo %%RANDOM:~-1%%%%RANDOM:~-1%%%RANDOM:~-1%% >>  %FileName%.bat
            if %calc%==4 echo echo %%RANDOM:~-1%%%%RANDOM:~-1%%%%RANDOM:~-1%%%%RANDOM:~-1%% >> %FileName%.bat
            if %calc%==5 echo echo %%Random%% >> %FileName%.bat
            if %calc%==6 echo echo %%Random%%%%RANDOM:~-1%% >> %FileName%.bat
            if %calc%==7 echo echo %%Random%%%%RANDOM:~-1%%%%RANDOM:~-1%% >> %FileName%.bat 
            if %calc%==8 echo echo %%Random%%%%RANDOM:~-1%%%%RANDOM:~-1%%%%RANDOM:~-1%% >> %FileName%.bat
            if %calc%==9 echo echo  %%Random%%%%RANDOM:~-1%%%%RANDOM:~-1%%%%RANDOM:~-1%%%%RANDOM:~-1%% >>  %FileName%.bat
            if %calc%==10 echo echo %%Random%%%%Random%% >> %FileName%.bat  
            goto CommandLine
            

            【讨论】:

              【解决方案14】:

              如果您将除以某个较大的值,您将一个接一个地得到大量重复。 您需要做的是取 %RANDOM% 值的模数:

              @echo off
              REM 
              SET maxvalue=10
              SET minvalue=1
              
              SETLOCAL 
              SET /A tmpRandom=((%RANDOM%)%%(%maxvalue%))+(%minvalue%)
              echo "Tmp random: %tmpRandom%"
              echo "Random:  %RANDOM%"
              ENDLOCAL
              

              【讨论】:

                猜你喜欢
                • 2017-12-20
                • 1970-01-01
                • 2012-09-26
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多