アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。
以下のようなバッチファイルを作成しました。

-----------------------
@echo off
SET RND=%RANDOM%
echo %RANDOM%
pause
-----------------------

期待する動きとしては、バッチの実行時に毎回0~32767の
乱数のいずれかが表示されてほしいのですが、9012,9020,9023,9026のように微増していく数字が表示され、とても乱数とはいえない状態です。

ちょっとした思い違いなのかもしれませんが、行き詰まってしまっています。DONコマンド,バッチに詳しい方、ご教授ください。

A 回答 (6件)

#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% すれば同じ値になります。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
回答者に対するお礼の内容がちょっと食い違ってしまっていることをお詫びします、「教えて!goo」を初めて使ったもので・・・ご容赦ください。

notnotさんのおしゃるようにプロンプトを開いた時間が、最初の%RANDOM%の結果に関係していることがわかりました。

実際に%RANDOM%を使用することを考えると、おっしゃる通りcallを用いるか、バッチファイルの中でダミーの%RANDOM%を一度実行させたあとで、実際に使用する変数に2度目の%RANDOM%の代入することで回避しようと思います。

以上、ありがとうございました。

お礼日時:2005/07/22 11:25

No.4回答者です。



そうですね。おっしゃるとおり「初期値」を読み落としておりました。
    • good
    • 1

%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回で全部違う値を返しています。
    • good
    • 0

%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

などとする必要があります。
    • good
    • 0

ようやく再現しました。



  [ 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する」という手で回避できないでしょうか。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
その後、いろいろ試した結果、xcrOSgS2wYさんのおしゃるようにプロンプトを開いた時間が、最初の%RANDOM%の結果に関係していることがわかりました。

それと質問で記述した内容が間違っていました。
正しくは以下のコードです、申し訳ありませんでした。(echoの行が間違っていました・・・)

-----------------------
@echo off
SET RND=%RANDOM%
echo %RND%
pause
-----------------------

実際に%RANDOM%を使用することを考えると、おっしゃる通りcallを用いるか、バッチファイルの中でダミーの%RANDOM%を一度実行させたあとで、実際に使用する変数に2度目の%RANDOM%の代入することで回避しようと思います。

以上、ありがとうございました。

お礼日時:2005/07/22 11:18

状況が再現しませんでした。


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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!