batch-file
バッチファイルのランダム
サーチ…
乱数
動的変数%Random%を使用すると、0から32767までのランダムな整数を得ることができます。例:
echo %random%
これは明らかに0から32767までの整数を返しますが、時にはそれが特定の範囲、例えば1から100になるようにしたい場合もあります。
特定範囲内の乱数の生成
これを行うための基本的な方法を以下に示します。
set /a result=(%RANDOM%*max/32768)+min maxは生成可能な最上位番号で、 minは生成可能な最小番号です。 set /a自動的に切り捨てられるので、小数点は得られません。小数点乱数を生成するには、次のようにしてください:
set /a whole=(%RANDOM%*max/32768)+min
set /a decimal=(%RANDOM%*max/32768)+min
echo %whole%.%decimal% 32767より大きい乱数の生成
試してみたら
set /a whole=(%RANDOM%*65536/32768)+1
あなたはおそらく奇数の乱数を得るでしょう。
32767より大きい数値を生成するには、より良い方法があります。
set /a result=%random:~-1%%random:~-1%%random:~-1%%random:~-1%%random:~-1%%random:~-1%
前のコードは、各%random%から1文字を抽出します。しかし、これは意図的に行われます。
randomは1桁の数字になる可能性があるため、最後の2桁を抽出することはできません。だから私たちは最後の文字だけを抽出します。この場合、6 %random:~-1% 、最大値は999999 、最小値は000000です。必要に応じて調整する必要があります。
擬似ランダム
cmd.exeは、 cmdセクションが開始された時刻に基づいてシードを生成します。したがって、ほぼ同じ時刻に複数のセクションを開始すると、結果が十分に「ランダム」にならない場合があります。
ランダムアルファベット
残念ながら、バッチにはアルファベットを生成する組み込みメソッドがありませんが、 %random%とforループを使用するとforアルファベットを '生成'できます。
これはどのように動作するかという単純な考えです。
set /a result=(%random%*26/32768)+1
for /f "tokens=%result%" %%I in ("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z") do (
echo %%I
)
- 最初の
set /a文は乱数Nを1から26の間で生成します -
for /f文は、AからZのリストからN番目の項目を選択します。- 結果を返す
1 forループ、および[this method]を使用して実質的に無制限のアイテムに合計31個のアイテムを配置できます( バッチ - forループパラメータの順序
バッチ内の擬似乱数とユニフォームランダム
擬似乱数分布
このスタックオーバーフローの答えには 、ユーザーCherryDTはこのコードを指摘:
set /a num=%random% %% 100
均一な分布を与えない。
内部の動的変数%random% は 一様な分布を与えますが、上記のコードは均一なランダムではありません。このコードは0〜99までの乱数を生成しますが、結果は一様ではありません。 32767 MOD 100 = 67なので、 32767 MOD 100以上になります。
上記のコードを使用して一様分布乱数を生成するには、 100変更する必要があります。ここでは、一様な分布を生成する数値を取得する方法があります。
32767 mod (32767 / n)
nは0〜32767の整数で、結果は小数であり、バッチでは機能しない可能性があります。
一様分布
set /a result=(%RANDOM%*100/32768)+1
この方法は均一な分布を生成する。バッチスクリプトでは、 "剰余"、 "モジュラス"のような%を使うのを避けます。 %を使用しないと、結果は均一になります。
あるいは、ここでは非効率的ではあるが一様な方法がある。
set /a test=%random%
if %test% geq [yourMinNumber] (
if %test% leq [yourMaxNumber] (
rem do something with your random number that is in the range.
)
)
[yourMinNumber]と[yourMaxNumber]を独自の値に応じて変更します。