• ベストアンサー

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

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

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10262)
回答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% (4848/10262)
回答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

  • バッチファイルについて

    バッチファイルで echo "あああ" のように文字を表示するechoコマンドがありますが、 echo "あああ" echo "いいい" とコマンドを打つと あああ いいい ↑という感じで同じページ(?)に表示されます。 あああと表示されたあとにページが切り替わって いいいと表示したのですが どのようなコマンドを打ち込めばいいのでしょうか? 説明が非常に下手ですみません。

  • バッチファイルで環境変数が設定されません

    よろしくお願いいたします。 Windows XP Pro の command.com において、バッチファイルの中で set コマンドを使って環境変数を設定しても、バッチから抜けると環境変数の設定ができていません。 バッチ終了後の環境変数は全てバッチ開始前と同じ状態です。 command.com のプロンプトで set コマンドを実行すると、環境変数はセットした内容に変化もしくは追加されます。 cmd.exe ではバッチからでもプロンプトからでも set コマンドで環境変数を操作できます。 なぜ command.com 上のバッチから操作できないのかわからず、不便でかないません。 アドバイスをよろしくお願いいたします。 @echo off set foo=word path=c:\ echo %foo% echo %path% 上記バッチを実行すると word c:\ と表示されますが、set コマンドで確認すると FOO は存在しません PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;... と表示されます。 これはバッチ実行前の値です。

  • バッチファイルのIF分岐にて任意の文字を入力しておきたい

    バッチファイルのIF分岐にて任意の文字を入力しておきたいです。 下記のようなバッチファイルを作成し、「1」を入力すると「:AAA」のラベル に飛びメッセージが表示されるようにしています。 最初から「1」が自動で入力されているような状況にすることはできますでしょうか? 「set NUM=1」にしておけば、Enterを押すだけで「1」が入力されている のはわかったのですが、DOS上に「1」が表示されていません。 入力待ちの際に「1」が入力されている状況を作りたいと思っています。 Windows XP 32bitで動作させたいです。 お手数ですが知識をお借りしたいと思います。 もしくは「ここを見ろ」というのをご教授ください。 -------------------------------------------------- @echo off :LOOP set NUM= cls echo. echo "1. AAA" echo "2. BBB" echo "0. 終了" echo. echo. set /p NUM="番号を入力してください >" if %NUM% == 1 goto :AAA if %NUM% == 2 goto :BBB if %NUM% == 0 goto :owari echo 番号がありません echo. pause goto :LOOP :AAA echo "AAAです" echo. pause goto :LOOP :BBB echo "BBBです" echo. pause goto :LOOP :owari echo 終了します echo. pause goto :eof --------------------------------------------------

  • For文のtokensにおけるバッチファイル作成について

    はじめまして。 バッチファイルにて以下のコマンドを作成して 実行したのですがきちんと実行されません。 コマンドプロンプトを起動して1個1個実行するときちんと 実行されます。どういうことなのでしょうか? <バッチファイル> @echo off cd /d デスクトップ for /F "tokens=2" %i in ( file.txt ) do echo %i >> result.txt pause <file.txtの中身> 1<tab>2<tab>3 4<tab>5<tab>6

  • コマンドプロンプトのバッチファイル実行までの速度

    コマンドプロンプトのバッチファイルを作成したのですが このバッチファイルの実行するまでの処理速度を、コマンドプロンプト上に表示させたいのですが、どのようなコマンドを組めばよいのでしょうか? ちなみにバッチファイルの中身は、 @echo off start http://www.yahoo.co.jp です。よろしくおねがいします。

  • jarファイルをバッチで実行させたい

     今晩は。  jarファイルをコマンドプロンプト画面からバッチで実行させようとして、 バッチを下の様に書いてやりましたが、うまく動作しません。  一体どこが悪いのでしょうか。  「java -jar C:\Documents and Settings\デスクトップ\test.jar  pause」  実行すると「>pause 続行するには何かキーを押してください . . .」と表示されますが、 キーを押すと画面が消えてしまいます。  (実行が終わって、コマンドプロンプト画面が閉じられているみたいな・・・)  また、pauseを削除すると、やはり一度はコマンドプロンプトの画面が表示はされますが、 コマンドプロンプト画面が閉じられます。(実行はしているような気がするのですが、、、)  どのようにバッチの内容を変更すれば、実行画面が表示されたまま、プログラムが止まるのでしょうか。  宜しくお願いします。

    • ベストアンサー
    • Java
  • バッチファイル

    会社で、OS WindowsXPを使ってきましたが、先日、初めてWindows7のPCを導入しました。 これまでPC購入時、XPのパソコン設定に使っていたバッチファイルがあります。 そのファイルは以前、別の人に作ってもらいました。 そのバッチファイルをWindows7でも使いたいのですが、設定が反映されませんでした。 私にはバッチファイルがさっぱり分かりません。 以下の内容がこれまで使っていたファイルの中身です。 どなたか、Windows7用に修正していただけないでしょうか。 どうぞ、よろしくお願いします。 【やりたい事】 ローカルセキュリティ設定のアカウントポリシーにて、   パスワードの長さ ⇒ 4文字以上   パスワードの変更禁止期間 ⇒ 0日   パスワードの有効期間 ⇒ 365日   パスワードの履歴を記録する ⇒ 0日   パスワードは要求する複雑さを満たす ⇒ 無効   暗号化を元に戻せる状態でドメインの全ておユーザーのPWを保存する ⇒有効 【WindowsXPで使っていたバッチファイルの中身】 @echo off cd c:\ @echo . @echo _______________________________________ @echo . @echo パスワードポリシーを変更します。 @echo (パスワードの有効期限:無期限、最小パスワード文字数:4文字) @echo _______________________________________ pause net accounts /maxpwage:365 /MINPWLEN:4 /MINPWAGE:0 net accounts pause 以上、よろしくお願いします。

  • バッチファイルで常に最新の現在時刻を表示したい

    バッチファイルで最新の現在時刻を表示したいのですが、うまく行きません。 そのバッチファイル自体を実行した時刻ではなく、そのバッチファイル内のコマンド等を実行した時刻を表示させたいのです。つまりどんどん時間を最新に近いものに更新させていって欲しいのです。 タスクスケジューラのようなものをバッチファイルで作りたくて、現在時刻が○○時であればこのコマンドを実行する、といったことがしたい訳です。 バッチファイルは実行してすぐ終了するのではなく、そのまま常駐するような形を想定しています。 なにか良い方法はないでしょうか。 ■ 5秒おきに現在時刻を表示するバッチファイルの例 (同じ時刻になってしまう) @echo off :start set time=%time: =0% echo . echo . echo .「現在時刻は%time:~-11,2%時%time:~-8,2%分%time:~-5,2%秒です。」 echo . echo . ping localhost -n 5 goto start

  • バッチファイル内のパスについて

    バッチファイルのパスについて質問があります。 下記内容のファイルを実行すると、  「C:\Programが見つかりません」 というようなエラーとなってしまいます。 setコマンド時には、スペースの入ったパスはエラーとなってしまうのでしょうか? どなたがご教授ください。お願いします。 @echo off set JAVA_HOME=C:\Program Files\JavaSoft\JRE\1.3.1_12

  • MSDOSバッチコマンド for-do

    過去31日間、today.dat を保存するバッチコマンドを、WinXPで組みましたが、doループ内で、環境変数:nextday (rename old%%i.dat old%nextday%.dat) が、正しく帰ってきません。 アドバイスお願いします。 :------------------------------------------- @echo off setlocal set maxday=30 set delday=31 cls echo 開始します。 Enter キーを 押してください。 pause > nul echo delete old%delday%.dat for /l %%i in (%maxday%,-1,1) do ( set /a nextday=%%i+1 echo. set nextday echo rename old%%i.dat old%nextday%.dat ) echo. echo copy today.dat old1.dat echo. echo 終了しました。 Enter キーを 押してください。 pause > nul endlocal :-------------------------------------------