バッチスクリプトでランダムを使用する方法


回答:


121

%RANDOM% 0から32767の間の乱数を与えます。

のような式を使用するとSET /A test=%RANDOM% * 100 / 32768 + 1、範囲を好きなように変更できます(ここでの範囲は[0…32767]ではなく[1…100]です)。


9
特定の問題を考えると、ある種のループを使用している可能性が高いですか?そして、あなたは確かに例えば経て遅延拡張を使用する必要がありますSETLOCAL ENABLEDELAYEDEXPANSIONし、使用して!RANDOM!の代わりに、%RANDOM%ユージン投稿のように、。
マウス2011

14
より一般的な表現は次のようになり%RANDOM% * (%maxval% - %minval% + 1) / 32768 + %minval%ます。最初に適切な値を設定minvalmaxvalてください。
マウス


55

%RANDOM%は、0〜32767の乱数を提供します。

次の方法で数値の範囲を制御できます。

set /a num=%random% %%100

-0から99までの数を生成します。

これです:

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

-1から100の間の数を生成します。


8
これは均一に分散されないことに注意してください!0から99の例をとると、32767モジュロ100は67であり、均一分布のために0である必要がないため、0から67は68から99に比べてわずかに多く発生します。(これ%random% %%100は魔法の構文ではありませんが、実際に%random % %% 100はスペースが1つ少なくなっています。ここでは、モジュロを表す%%単なるエスケープ%です。)
CherryDT

Windows 10でこれを実行しようとすると、「オペランドがありません」というエラーが発生します。モジュロに必要なのは%だけです。
Calmarius

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上記のようなライナーを1つ使用できるのに、なぜ使用するのですか?他のソリューションでは、範囲を明示的に指定できます。コードの利点は何ですか?
Max Leske 2014

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

例 "

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

は、100から50の間の乱数を与えます。バッチスクリプトで行を使用していない場合は、必ず1つのパーセント記号をオペランドとして使用してください。


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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.