2016-10-27 2 views
0

を返さない:%ランダム%変数は、私はこのコードを使用してい乱数

ほとんどの部分について
set /a alg=!random!*!activecount!/32768+1 

、それが動作します。ただし、変数!random!は完全に乱数を生成していません。代わりに、それは常に遅いペースでカウントアップしています。ここで、変数!activecount!が2に等しいと仮定すると、非常に長い時間変化することなく、常に1または2のいずれかを生成します。 ランダム変数がランダム化されないのはなぜですか?私は事実の後に!random!をエコーし​​てみました。そしてそれは乱数を生成します。何がありますか?

+1

@KenWhite - いいえ、それは種の価値の問題です。 [私の答え](http://stackoverflow.com/a/40275316/1012053)を参照してください。 – dbenham

+4

@dbenham:いいキャッチ!私はそれ以上の文脈がなければそれを考えなかった。たぶんポスターは、未来のためのレッスンを学ぶでしょう。つまり、文脈から1行ではなく、問題を再現するのに十分な関連コードを提供するべきです。 –

答えて

6

あなたのコードは十分に表示されていませんが、問題の内容を知っていると思います。

あなたのコードは、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セッションは同じシード値を取得するため、これらのセッションのそれぞれはまったく同じ疑似ランダムシーケンスを取得します。

+2

この「ランダム化」コードは、各cmd.exeセッションの開始時に使用することをお勧めします:/ L %% i for(0,1、!時間:〜-1!)do/A!random!do – Aacini

+0

@ Aacini - 私はそれが好きです:-)私は 'set/a'の代わりに' rem!!random! 'を使用し、1の代わりに最後の2桁を使用します。 – dbenham

関連する問題