更新日:、 作成日:

VBA Rnd 関数:乱数を生成する

はじめに

Excel VBA マクロの Rnd 関数から乱数を生成する方法を紹介します。

Rnd 関数は、0 ~ 1 の乱数 (ランダムな小数) を返します。

Randomize ステートメントを実行して、シード値をランダムに変更できます。

Rnd 関数を呼び出すたびに新しい乱数を取得できます。

Int((最大値 - 最小値 + 1) * Rnd + 最小値) のようにして、乱数を指定の範囲の整数で取得できます。

Rnd 関数の引数と戻り値

Rnd(数値)
指定した数値のシード値の乱数表から乱数を取得します。

Rnd()
次の乱数を取得します。

引数「数値」省略できます。指定した数値が正の値、0、負の値で次のようになります。
  • 正の値 (既定):次の乱数の値を返します。
  • 0:直前の乱数の値を返します。
  • 負の値:シード値を指定して乱数を返します。
戻り値の型数値型 (Single)

解説

0 ~ 1 未満の値をランダムに返します。

乱数を次々に取得したいときは、引数なしで呼び出すか引数「数値」に正の値を指定します。

前回の乱数と同じ値を取得するには、引数「数値」に 0 を指定します。

Int((最大値 - 最小値 + 1) * Rnd + 最小値) のように入力して、乱数の範囲を指定して整数で取得できます。

シード値

乱数と言っても乱数表によって次に取得する値が決められています。乱数表はいくつもあり、それを識別する値をシード値と言います。

シード値が同じなら毎回決まった順番で乱数を生成します。Excel を起動したときのシード値は毎回同じです。そのため、Rnd 関数を呼び出す前に必ずシード値をランダムに変更する必要があります。

シード値をランダムに変更するには Randomize ステートメントを実行します。

引数「数値」に負の値を指定すると、シード値を指定できます。つまり、何度でも同じ乱数を再現できます。

使用例

Rnd 関数の使用例を紹介します。

ランダムな値を生成する

Randomize ステートメントを最初に実行して、シード値がランダムに変更されます。これにより乱数を生成できます。

Randomize ' ランダムにシード値を選択する

Dim f As Single
f = Rnd
Debug.Print(f) ' 0.2098439 など毎回変わる
f = Rnd
Debug.Print(f) ' 0.1017115 など毎回変わる

f = Rnd(0) ' 前回と同じ乱数を取得
Debug.Print(f) ' 0.1017115

Randomize ステートメントを実行しないと、Excel 起動時のシード値は固定されているので毎回同じ結果になります。これでは乱数の意味がありません。

' シード値を変更しない
Dim f As Single
f = Rnd
Debug.Print(f) ' 0.7055475 毎回同じ
f = Rnd 
Debug.Print(f) ' 0.533424  毎回同じ

シード値を指定する

引数「数値」に負の値を指定してシード値を指定できます。同じシード値を指定すると、最初から同じ順番で乱数を生成します。乱数を再現したいときに使用します。

Dim f As Single

f = Rnd(-1) ' シード値を -1 にする
Debug.Print(f) ' 0.224007
f = Rnd
Debug.Print(f) ' 3.584582E-02

f = Rnd(-2) ' シード値を -2 にする
Debug.Print(f) ' 0.7133257
f = Rnd
Debug.Print(f) ' 0.6624333

f = Rnd(-1) ' シード値を -1 にする
Debug.Print(f) ' 0.224007
f = Rnd
Debug.Print(f) ' 3.584582E-02

乱数の範囲を指定して整数で取得する

乱数の最大値と最小値を指定して、その範囲の整数を取得できます。

Const low As Integer = 1   ' 最小値
Const high As Integer = 10 ' 最大値

Randomize

Dim i As Integer
' low ~ high の範囲の整数をランダムに生成する
i = Int((high - low + 1) * Rnd + low)
Debug.Print(i) ' 1 ~ 10