2

バッチ ファイルを使用して、0 から 3 までの確率変数を作成しようとしています。現在、次のコードがあります。

@echo off
set /a var=%random%/8192
@echo %var%
Pause

このバッチ ファイルは、毎回「2」を返します。同じコマンドをコマンド ラインに直接入力すると、0 から 3 が返されます。

関連する知識をいただければ幸いです:)

4

5 に答える 5

3

編集:OPが質問を変更したため、回答を変更しました:もともと、目的の乱数の範囲は0から4でした...

正しい式は次のとおりです。

set /a var=%random% * 4 / 32768

代わりに他の演算子 (/ や % など) を使用すると、乱数の分布が変更されるため、正しい式よりも頻繁に結果が繰り返されます。

編集追加の説明が追加されました

上記の例では、前のコードが正しく機能するはずです。ただし、コードがコード ブロック(括弧で囲まれている) 内に配置されている場合は、ブロック内で変更される可能性のあるすべての変数 (RANDOM を含む) で (他の人が回答で示したように) 遅延展開を使用する必要があります。例えば:

@echo off
setlocal EnableDelayedExpansion
:ProgStart
(
set /a var = !random! * 4 / 32768
goto target!var!
)

必要に応じて、同等の結果 (0 から 3 の間の乱数) を与える次の簡単な式を使用できます。

set /a var = !random! / 8192
于 2013-04-07T15:19:03.530 に答える
1

あなたのコードは問題ありません。疑惑はあるけど。完全なスクリプトで、ループまたはステートメントset var内でその値をチェックしますか? その場合、結果の値を確認すると、スクリプトが環境変数の値として継承したものである可能性があります。おそらく、スクリプトの外部でコマンドラインをテストしたことによるホールドオーバーです。forif%var%%var%

私の評価が正しければ、 と が必要setlocal enabledelayedexpansionですecho !var!。それ以外の場合は、その時点で含まれていた値または最初に検出された値でfor評価さifれます。%var%forif

于 2013-04-07T15:17:49.487 に答える
1

iforforコードブロック内で %random% を使用していると思います。この場合delayed expansion、!variables!が必要です。%variables% の代わりに。例:

@echo off & setlocal enabledelayedexpansion
for /l %%i in (1,1,5) do (
    echo %random% !random!
)
于 2013-04-07T06:42:48.893 に答える
1

必要な実際のコマンドは次のとおりです。

set /a var=%random% %% 4

これにより、0、1、2、または 3 が得られます。

FOR ループ内でこれを行う場合は、%..% 型の変数の代わりに !.! 型の変数を使用します。この場合setlocal enabledelayedexpansion、バッチ ファイルの先頭近くの場所も必要になります。

于 2013-04-08T14:44:00.923 に答える