Як користуватися випадковим чином у сценарії BATCH?


Відповіді:


121

%RANDOM% дає випадкове число між 0 і 32767.

Використовуючи такий вираз SET /A test=%RANDOM% * 100 / 32768 + 1, ви можете змінити діапазон на все, що вам подобається (тут діапазон становить [1… 100] замість [0… 32767]).


9
Враховуючи конкретну проблему, ви, швидше за все, будете використовувати якусь петлю? Тоді ви дійсно повинні використовувати затримку розширення, наприклад, через SETLOCAL ENABLEDELAYEDEXPANSIONта використовувати !RANDOM!замість %RANDOM%, як Євген розмістив.
mousio

14
Більш загальним виразом було б %RANDOM% * (%maxval% - %minval% + 1) / 32768 + %minval%; просто встановити minvalі maxvalна відповідні значення перших.
mousio

1
Дивіться також відповідь
indiv

55

% RANDOM% дає випадкове число від 0 до 32767.

Ви можете керувати діапазоном номера за допомогою:

set /a num=%random% %%100

- дасть число між 0 ~ 99.

Ось цей:

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

- дасть число від 1 до 100.


8
Зауважте, що це не буде рівномірно розподілено! Беручи приклад 0 ~ 99, числа 0 ~ 67 будуть виникати дещо частіше, ніж числа 68 ~ 99, оскільки 32767 модуля 100 дорівнює 67, а не 0, як це було б для рівномірного розподілу. (Це %random% %%100не чарівний синтаксис, але насправді %random % %% 100з одним меншим простором, де %%просто %
збіг,

У мене виникає помилка "Відсутній операнд" при спробі цього в Windows 10. Схоже, вам потрібен лише синген% для модуля.
Кальмарій

19

Ви, ймовірно, захочете отримати кілька випадкових чисел, а можливо, зможете вказати різний діапазон для кожного, тому вам слід визначити функцію. У своєму прикладі я генерую числа від 25 до 30 с call:rand 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

thx, добре працювати: якщо для / L %% a в (1 1% 3 ') зателефонуйте: rand% 1% 2
Це не було мені


4

Ви могли це зробити так, чого не потрібно EnableDelayedExpansion

:choosenamea
cls
set /a choosemname=%random%

if %choosemname% GTR %max% goto choosenameb
if %choosemname% LSS %min% goto choosenameb
goto gotnamenow

де maxваш макс і minваш мінімум. Це не дуже ефективно, оскільки може зайняти багато раундів, якщо ваш діапазон занадто малий. Також це не буде працювати для чисел, більших за 32767.


3

Скажімо, ви хочете число 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.


3
Чому б ви використовували, gotoколи у вас є один лайнер, як вище? Інші рішення дозволяють чітко вказати діапазон. Яка перевага вашого коду?
Макс Леске

2
set /a number=%random% %% [maximum]-[minimum]

приклад "

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

дасть випадкове число від 100 до 50. Обов’язково використовуйте лише один відсотковий знак як операнд, якщо ви не використовуєте рядок у пакетному сценарії!


У Windows 10 він дає цифри від -50 до 49, як слід. Чи справді це було колись інакше?
kilves76

2
@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

1
дайте цьому пробіли, щоб у нього були рядки, як @echo off
Sinji58

1
@(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 та великою кількістю ((()))


1

І просто бути абсолютно випадковим для тих, хто не завжди хоче чорний екран.

@(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

Це змінить колір екрану і обидва випадкові.


1

Якщо ви поділите на якусь велику вартість, ви отримаєте величезну кількість дублікатів один за одним. Що потрібно зробити, це взяти модуль значення% 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

0

ось приклад, який я створив для вас, він повинен відображати діалогове вікно з проханням вибрати число 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

-1

тепер представлені всі кольори дос веселки

@(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

Я думаю, що це порушено
Дитина Божа

-1

І щоб бути абсолютно випадковим, повна відсутність порядку: 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.