はじめに
例えばWindowsでテスト用のダミーファイルを生成する際、一般的にはfsutil
コマンドをよく使いますが、今回は完全にランダムな文字列のファイルを(出来るだけ同じサイズで)作りたかったので、%RANDOM%
を使って、指定した個数・長さのランダム数字列をファイルに出力するバッチを作成してみました。
実装例
この実装例ではファイル名、数列の個数・桁数などの設定はINIファイルに切り出しています。(毎回バッチファイル編集するのもめんどくさいですし・・・・・・)
(9/29追記)
コメント欄で @kshibamo さんにご指摘いただきましたが、確かに環境変数PATHを書き換えているように見えるのでちょっとパラメータ名直してます。ご指摘ありがとうございました。
;生成するファイル名
FILEPATH=seq.txt
;生成する数列の数
SEQNUMBER=5
;生成する数列の桁数
SEQLINES=10
バッチファイルの実装例は以下の通り。
要はINIファイルで指定した回数分だけfor文を回して、その都度%RANDOM%
の下1桁を切り出して、ファイルに書き出しています。試してないけど10掛けて32768で割るのとどっちが早いんだろ?
%RANDOM%
の範囲が0~32767なので、実は0~9の出る確率は等しく1/10ではありませんが、0.1%も差はないので、そこは誤差の範疇ということで見逃して貰えれば・・・・・・
あと注意してほしい点として、for文の中で%RANDOM%
を使う場合、ちゃんとsetlocal enabledelayedexpansion
(いつも思うけど見辛い・・・・・・)してあげないと、おんなじ値が何度も繰り返し出ちゃうため、そこは気を付けてください。詳しくは「遅延環境変数」で検索、検索ゥー!(手抜き)
@echo off
rem 指定長・個数のランダム数字列生成バッチ
setlocal enabledelayedexpansion
%~d0
cd %~d0%~p0
cd
rem INIファイル読み込み
for /F "delims== tokens=1,2" %%i in (makeseq.ini) do (
set %%i=%%j
)
rem 数字列の個数分繰り返し
for /l %%i in (1,1,%SEQNUMBER%) do (
rem 数字列の指定長分1文字のランダム数字をファイルに出力
for /l %%i in (1,1,%SEQLINES%) do (
set /P X=!RANDOM:~-1!<NUL >> %FILEPATH%
)
rem 改行挿入
echo.>>%FILEPATH%
)
pause
実際にバッチを叩いて数列を出力すると、以下のような感じになります。
0315409597
3361260796
6949076383
9725482743
7695448784
おわりに
fsutil
コマンドを叩いた時と比較すると、NULL文字ではない完全にランダムな数列が出来る、管理者権限不要という、といったところがメリットでしょうか。
ただし、for文を何度もぐるぐる回してその都度ランダムな数値を生成しては書き出している関係上、大きい数列を生成するとかなり遅いので、用途に合わせて使い分けする形にはなるかと。
ただ、for文でぐるぐる回すところとか、%RANDOM%
の下1桁だけ切り出すところとか、もうちょっとスマートなやり方がある気はします。