Excel には 0 以上 1 未満の乱数を返す RAND という関数が用意されています。
任意のセルに「=RAND()」と入力すれば
というような数を返してくるのですが、シート上でセルへの入力など別の操作を行ったりしたときに、
という感じでくるりと値を変えてしまうのです。列に乱数が並んでいるときなどは目がちらつきますし、実際的な問題として Excel が少しだけ重たくなってしまいます。そこで値をころころ変えない乱数を出力するためのユーザー定義関数を作ります。
Function FRAND() As Double
Randomize
FRAND = Rnd
End Function
はい。これだけです。 VBA に馴染みのない人は「何の冗談?」と思われるかもしれませんが、VBA 関数として用意されている Rnd を改めて新しい関数 FRAND() に入れてシート上で使える関数にしてあるだけのことです。
使い方は RAND 関数と全く同じです。0 以上 10 未満の乱数が欲しければ、
と入力します。1 ~ 10 の無作為な整数が得たいときは、INT 関数で小数点以下を切り捨てて 1 を加えます:
より一般化して a(最小値)から b(最大値)の整数を得るには、
と入力します。a と b は任意の整数を入れてください。この式の意味については下のコラム「指定した範囲の整数を得る」で説明していますので、そちらを参照してください。いずれにしても、この式は何かの拍子に忘れてしまいそうですし、入力も面倒です。Excel には RANDBETWEEN という関数も用意されているのですが、それも先程と同じく操作のたびに値を変えるという面倒なところがあります。
固定された乱整数を出力するユーザー定義関数
そこで上式と同じ結果を返すための、より一般化されたユーザー定義関数を作って登録しておくと便利です。
Function FRANDBETWEEN(a As Long, b As Long) As Long
Randomize
FRANDBETWEEN = Int((b - a + 1) * RND) + a
End Function
コラム「指定した範囲の整数を得る」
ワークシート上で a ~ b の無作為整数を得るには
という式を入力します。ユーザーは任意の a と b を入力します。
上式の意味を少し説明すると、たとえば
とした場合、
となり、これは 5 から 10 までの範囲にある数の個数を表します:
そこに FRAND をかけてみると、その値 x = FRAND()*6 は
の値を計算するので、INT で小数点を切ると 6.0 は含まれないので
の範囲の整数値を得ます。そこに min = 5 を加えて
となり 5 以上 10 以下の整数値が得られることになります。