あなたのコードは十分に表示されていませんが、問題の内容を知っていると思います。
あなたのコードは、1つのコマンドセッション内で単純なループでは正常に動作します:
@echo off
setlocal enableDelayedExpansion
set "activecount=10"
for /l %%n in (1 1 10) do (
set /a alg=!random!*activecount/32768+1
echo !alg!
)
--OUTPUT--
7
8
6
6
9
4
3
1
8
9
しかし、それぞれの場合、それは動作しませんランダム!新しいcmd.exeセッションにあります。これは、ランダムシーケンスはcmd.exeの起動時に開始され、シード値は現在の時刻から派生し、シードは1秒に1回だけ変更されるためです。ここでhttps://stackoverflow.com/a/19697361/1012053
が新しいcmd.exeのセッション内の各実行であなたのコードで参照してください:
@echo off
setlocal disableDelayedExpansion
set "activecount=10"
for /l %%n in (1 1 10) do (
cmd /v:on /c "set /a !random!*activecount/32768+1"
echo(
)
- OUTPUT -
6
6
6
6
6
6
6
6
6
6
私たちならば何が起こっているかを確認するために簡単です生の!ランダムをプリントアウト!値は、我々は5の各クラスタ間の1秒の遅延を置く場合:
@echo off
for /l %%n in (1 1 5) do (
for /l %%m in (1 1 5) do (
cmd /v:on /c "set /a !random!"
echo(
)
timeout /t 1 >nul
echo(
)
- OUTPUT - 第二与えられた範囲内で
21755
21755
21755
21755
21755
21758
21758
21758
21758
21758
21761
21761
21761
21761
21761
21764
21764
21764
21764
21764
21768
21768
21768
21768
21768
、シード値は一定のままであるので、第1のランダム数字は一定です。しかし、新しい秒ごとに、シード値が少しずつ増加します。 「ランダム」数を小さな範囲に制限するために使用する数式を考えると、結果の値が変更されるまでには時間がかかることがわかります。
最初のコードは、擬似乱数が同じセッション内で機能することを示していることに注意してください。しかし、同じ秒内に開始するすべてのcmd.exeセッションは同じシード値を取得するため、これらのセッションのそれぞれはまったく同じ疑似ランダムシーケンスを取得します。
@KenWhite - いいえ、それは種の価値の問題です。 [私の答え](http://stackoverflow.com/a/40275316/1012053)を参照してください。 – dbenham
@dbenham:いいキャッチ!私はそれ以上の文脈がなければそれを考えなかった。たぶんポスターは、未来のためのレッスンを学ぶでしょう。つまり、文脈から1行ではなく、問題を再現するのに十分な関連コードを提供するべきです。 –