• ベストアンサー

WindowsのRANDOM関数を用いたバッチファイル

お世話になります。 以下のようなバッチファイルを作成しました。 ----------------------- @echo off SET RND=%RANDOM% echo %RANDOM% pause ----------------------- 期待する動きとしては、バッチの実行時に毎回0~32767の 乱数のいずれかが表示されてほしいのですが、9012,9020,9023,9026のように微増していく数字が表示され、とても乱数とはいえない状態です。 ちょっとした思い違いなのかもしれませんが、行き詰まってしまっています。DONコマンド,バッチに詳しい方、ご教授ください。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.5

#3です。 >21時46分52秒の中で6回実行できましたが、%random%はその6回で全部違う値を返しています。 同じCMD.EXEの中で繰り返し%RANDOM%を参照すれば当然その度に違う値になるのは当たり前です。そのためのRANDOM機能です。 あくまで初期値の話です。 >%RANDOM% の初期値は、CMD.EXE を起動した時刻(時分秒)によって与えられるようです。 @echo %TIME% %RANDOM% というX.BATを作って、 for /L %I in (1,1,100) do @cmd /c x.bat でわかります。 あるいは、start & start & start として同時に複数個のコマンドプロンプトを開いて、それぞれの窓で echo %RANDOM% すれば同じ値になります。

progress_kick
質問者

お礼

ご回答ありがとうございます。 回答者に対するお礼の内容がちょっと食い違ってしまっていることをお詫びします、「教えて!goo」を初めて使ったもので・・・ご容赦ください。 notnotさんのおしゃるようにプロンプトを開いた時間が、最初の%RANDOM%の結果に関係していることがわかりました。 実際に%RANDOM%を使用することを考えると、おっしゃる通りcallを用いるか、バッチファイルの中でダミーの%RANDOM%を一度実行させたあとで、実際に使用する変数に2度目の%RANDOM%の代入することで回避しようと思います。 以上、ありがとうございました。

その他の回答 (5)

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.6

No.4回答者です。 そうですね。おっしゃるとおり「初期値」を読み落としておりました。

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.4

%random%の値が「時分秒」から与えられているのでないことは確かですよ。 なぜなら、echo %random% を手入力で繰り返しても、同じ1秒の中でちゃんと値が変わるからです。 たった今やってみたところ、次のようになりました。 (21:46:51) C:\tmp>echo %random% 17322 (21:46:52) C:\tmp>echo %random% 23450 (21:46:52) C:\tmp>echo %random% 9357 (21:46:52) C:\tmp>echo %random% 20766 (21:46:52) C:\tmp>echo %random% 18467 (21:46:52) C:\tmp>echo %random% 29722 (21:46:52) C:\tmp>echo %random% 26509 (21:46:53) C:\tmp>echo %random% 26588 21時46分52秒の中で6回実行できましたが、%random%はその6回で全部違う値を返しています。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.3

%RANDOM% の初期値は、CMD.EXE を起動した時刻(時分秒)によって与えられるようです。したがって、%RANDOM% を求めるために毎回CMD.EXEを起動すると、同じ1秒の間に起動すると同じ値が得られてしまいます。 1つのバッチファイルの中で何度も%RANDOM%を求めるなら問題ないんですが。 短い時間に何度もCMD.EXEを起動してそのたびに違う乱数を得たいなら、%RANDOM%に頼る事は出来ません。vbscriptを使って、 echo randomize:WScript.Echo int(rnd*32768) >r.vbs for /f %%A in ('cscript //nologo r.vbs') do set RND=%%A などとする必要があります。

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.2

ようやく再現しました。   [ rand.bat ]   echo %random% を用意して   for %f in (\winnt\system32\*) do cmd /c rand.bar とやると(カッコの中は、何度も繰り返すのであれば何でも良いのですが)、3ないし4ずつ単調に増加する数字が表示されます。 しかし   for %f in (\winnt\system32\*) do call rand.bat であれば、ランダムに見えるような数字が表示されます。 美しい解決方法ではありませんが、ひとまず「%random%を使いたい場所で別のバッチをcallする」という手で回避できないでしょうか。

progress_kick
質問者

お礼

ご回答ありがとうございます。 その後、いろいろ試した結果、xcrOSgS2wYさんのおしゃるようにプロンプトを開いた時間が、最初の%RANDOM%の結果に関係していることがわかりました。 それと質問で記述した内容が間違っていました。 正しくは以下のコードです、申し訳ありませんでした。(echoの行が間違っていました・・・) ----------------------- @echo off SET RND=%RANDOM% echo %RND% pause ----------------------- 実際に%RANDOM%を使用することを考えると、おっしゃる通りcallを用いるか、バッチファイルの中でダミーの%RANDOM%を一度実行させたあとで、実際に使用する変数に2度目の%RANDOM%の代入することで回避しようと思います。 以上、ありがとうございました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

状況が再現しませんでした。 思い違いが発生する程のコードではないので、 特別な間違いとかはないと思います。 たまたま、そのように 近い数字になったのではないでしょうか? (%RANDOM%の仕組みについて内情はわかりませんのではっきりとは言えませんが) %RAMDOM%の精度が悪いということであれば、 VBScriptのRND関数を使ってみてはどうでしょうか

関連するQ&A