サイトについて      連絡先   検索

VBA Rnd 関数

はじめに

Excel VBA マクロの Rnd 関数を紹介します。

Rnd 関数は、乱数 (ランダムな数値) を返します。

指定した整数の範囲で取得もできます。

  • 目次
    • 構文
    • 解説
    • 使用例

構文

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

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

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

解説

0 ~ 1未満の値を返します。

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

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

シード値

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

シード値が同じなら毎回決まった順番で乱数が返されます。Excel を起動したときのシード値は毎回同じです。

シード値をランダムに変更するには 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
  • 目次
    • 構文
    • 解説
    • 使用例