こんにちは、ふみです。みなさんは VBScript で乱数を取得しようと思ったことはありますか?
Excelでは RANDBETWEEN関数で最小値と最大値を指定するだけで簡単に整数の乱数を取得できますが、VBScript でも同じような使い方で範囲内の整数の乱数を取得する方法を紹介します。
Rnd関数と Int関数
VBScript や VBA に組み込まれている Rnd関数は、0以上1未満の値を返します。
よって、最小値を lngMin、最大値を lngMax とするランダムな整数を変数lngRnd に代入するには、次のようになります。
lngRnd = Int((lngMax - lngMin + 1) * Rnd + lngMin)
ここで使われている Int関数は、少数点以下を切り捨てて整数にする組み込み関数です。Int関数の引数が「3.5」の場合、戻り値は「3」になりますが、引数が「-3.5」の場合、戻り値は「-4」になります。
Int関数に似ている組み込み関数で Fix関数があります。Fix関数の引数が「3.5」の場合、戻り値は「3」になりますが、引数が「-3.5」の場合、戻り値は「-3」になり、Int関数と動作が異なるので注意しましょう。Fix関数の小数点以下を切り捨てる動作は Excel関数のTRUNC 関数、ROUNDDOWN関数と同じです。
Rnd関数でランダムな整数を取得するときに Fix関数を使用すると指定範囲が負の数のときに数値が1つ、0のほうにずれるので、ここでは Int関数のほうを使います。
指定された範囲内の整数の乱数を取得する
ファンクションを使うと Excel の RANDBETWEEN関数のように最小値と最大値を指定するだけで範囲内の整数の乱数を取得することができます。
整数の乱数を取得するファンクションを組み込んだプログラムは次のとおりです。
サンプルコード
Randomize MsgBox RandomIntegerBetween(1, 6) WScript.Quit '****************************************************************************** '引数lngN1とlngN2で指定した範囲内の整数の乱数の戻り値を返す Function RandomIntegerBetween(ByVal lngN1, ByVal lngN2) Dim lngMin, lngMax If lngN1 <= lngN2 Then lngMin = lngN1: lngMax = lngN2 Else lngMin = lngN2: lngMax = lngN1 End If RandomIntegerBetween = Int((lngMax - lngMin + 1) * Rnd + lngMin) End Function
上記のコードを Windows 10 のアクセサリから開いたメモ帳へコピー&ペースト後、文字コードを「ANSI」に設定し、適当なファイル名に拡張子「.vbs」を付けてデスクトップ等に保存すると、すぐに動作確認できます。
保存した vbsファイルをダブルクリックすると、1~6までの間のいずれかの整数値がメッセージボックスで表示されます。サイコロと同じです。
解説
1行目は Randomizeステートメントです。Randomizeステートメントは Rnd関数の乱数ジェネレーターを初期化します。この記述がないとRnd関数の乱数のパターンが毎回同じ結果になります。
2行目は6行目のアスタリスク(*)より下にあるファンクションの戻り値をメッセージボックスで表示します。
Excel の RANDBETWEEN関数のように最小値と最大値を指定して範囲内の整数の乱数を取得しています。
6行目のアスタリスクから下は指定された範囲内の整数の乱数を取得するファンクションです。
12~16行目は乱数の範囲の最小値と最大値の順番が逆になっていたら入れ替えるようにしています。
ちなみに、Excel の RANDBETWEEN関数は最小値と最大値の順番が逆になっていたらエラー(#NUM!)になります。
このファンクションは Excel等の VBAでも動作しますが、VBAで動作させる場合、戻り値、引数、変数、定数の型を「As ~」と記載したほうが良いです。VBA は引数の型が同じでないとエラーになります。
まとめ
- Rnd関数は、0以上1未満の値を返す
- 整数に切り捨てる Int関数は引数が「-3.5」の場合、戻り値は「-4」になる
- Rnd関数でランダムな整数を取得するときは Int関数を使う
- Randomizeステートメントの記述がない場合、Rnd関数の乱数のパターンが毎回同じ結果になる
ありがとうございました。
コメント