Rnd関数:乱数を生成する

Rnd 関数は Excel VBA で用意されている関数の一つで、乱数を生成します。作成される乱数は 0 以上 1 未満の数値で、必要に応じて指定した範囲の乱数になるようにすることができます。ここでは Excel VBA における Rnd 関数の使い方について解説します。

(Last modified: )

Rnd関数の定義と使い方

Rnd 関数は 0 以上 1 未満の乱数を生成し返します。

Split(expression)

Rnd 関数はシード値に基づいて乱数を生成します。同じシード値を使用して乱数を生成すると、同じ順番で乱数が生成されます。

Excel を起動すると自動的にシード値が設定されますが、このシード値は毎回同じ値が設定されます。そのため、乱数を生成しても明示的にシード値を変更しないと毎回同じ乱数の値が順番に生成されてしまいます。

次の例を見てください。

Option Explicit

Sub Rnd関数()
    Debug.Print Rnd
    Debug.Print Rnd
    Debug.Print Rnd
End Sub

Rnd関数の定義と使い方(1)

Excel を起動して最初にこのプログラムを実行するとイミディエイトウィンドウには次のように表示されます。

Rnd関数の定義と使い方(2)

では一度 Excel を終了し、あらためて Excel を起動してからもう一度同じプログラムを実行してみます。すると先ほどとまったく同じ乱数が生成されます。

Rnd関数の定義と使い方(3)

Randomize文を使ってシード値を変更する

このように同じ乱数が生成されるのを防ぐには、乱数の生成に使用するシード値を変更する必要があります。手動で変更する方法はあとでご紹介しますが、自動的にシード値が変わるようにするには、乱数の生成を行う前に Randomize 文を実行します。

Randomize

先ほどのサンプルを次のように変更します。

Option Explicit

Sub Rnd関数()
    Randomize

    Debug.Print Rnd
    Debug.Print Rnd
    Debug.Print Rnd
End Sub

Rnd関数の定義と使い方(4)

乱数の生成を行う前に Randomize 文を実行しています。これでシード値が変更されるため、プログラムを実行するたびに異なるシード値に基づいて乱数が生成されるようになります。

実際にExcel を起動して最初にこのプログラムを実行するとイミディエイトウィンドウには次のように表示されます。

Rnd関数の定義と使い方(5)

先ほどとは異なる乱数が生成されました。ではもう一度 Excel を起動しなおして同じプログラムを実行してみます。

Rnd関数の定義と使い方(6)

また先ほどとは異なる乱数が生成されました。このように乱数を生成するプログラムを記述する場合には、一度 Randomize 文を実行して乱数で使用するシード値を変更されるようにしてください。

シード値を手動で指定する

乱数を生成するときに使用するシード値は手動で指定することもできます。 Rnd 関数の省略可能な 1 番目の引数に負の値を指定すると、指定した値がシード値に設定されます。例えば -3 を指定する場合は次のように記述します。

Rnd(-3)

次の例を見てください。

Option Explicit

Sub Rnd関数()
    Randomize

    Debug.Print Rnd(-3)
    Debug.Print Rnd
    Debug.Print Rnd(-1)
    Debug.Print Rnd
    Debug.Print Rnd(-3)
    Debug.Print Rnd
End Sub

シード値を手動で指定する(1)

プログラムを実行するとイミディエイトウィンドウには次のように表示されます。

シード値を手動で指定する(2)

まず最初にシード値として -3 を指定して乱数を生成します。次はシード値を指定していないので同じシード値の次の乱数を生成します。そのあと今度はシード値として -1 を指定して乱数を生成し、同じシード値でもう一度乱数を生成します。そして再度シード値として -3 を指定して乱数を生成すると、最初と同じ乱数が生成されているのが分かります。また次の乱数も同じです。

シード値を手動で指定する(3)

このようにシード値を手動で指定して乱数を生成することもできます。なお Rnd 関数の 1 番目の引数に正の値を指定した場合は引数を省略した場合と同じで、同じシード値の次の乱数を取得します。

一つ前に生成した乱数と同じ乱数を取得する

Rnd 関数の省略可能な 1 番目の引数に 0 を指定すると、一つ前に生成した乱数と同じ乱数を生成できます。

Rnd(0)

次の例を見てください。

Option Explicit

Sub Rnd関数()
    Randomize

    Debug.Print Rnd
    Debug.Print Rnd(0)
End Sub

一つ前に生成した乱数と同じ乱数を取得する(1)

プログラムを実行するとイミディエイトウィンドウには次のように表示されます。

一つ前に生成した乱数と同じ乱数を取得する(2)

2 つ目の乱数では Rnd 関数の引数に 0 を指定しているので、一つ前に生成した乱数と同じ乱数を生成しています。

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

Rnd 関数では 0 以上 1 未満の乱数を生成します。これを例えば 10 から 20 までの整数の乱数を取得したい場合、次のように記述します。

Int((最大値 - 最小値 + 1) * Rnd + 最小値)

すると最小値以上、最大値以下の整数の乱数を取得できます。(この記述の仕方の場合は未満ではなく以下になりますのでご注意ください)。

例として 1 以上 6 以下の整数の乱数を取得するには次のように記述します。

Option Explicit

Sub Rnd関数()
    Dim i As Integer
    
    Randomize

    For i = 1 To 10
        Debug.Print Int((6 - 1 + 1) * Rnd + 1)
    Next i
End Sub

指定した範囲の整数の乱数を取得する(1)

プログラムを実行するとイミディエイトウィンドウには次のように表示されます。

指定した範囲の整数の乱数を取得する(2)

1 から 6 までの範囲の乱数を取得することができました。

※ 今回のサンプルでは取得した乱数の整数部分を朱徳するために Int 関数を使用しています。 Int 関数の使い方については「Int関数:数値の整数部分を取得する」を参照されてください。

-- --

Excel VBA における Split 関数の使い方について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。