Rnd関数:乱数を生成する
Rnd 関数は Excel VBA で用意されている関数の一つで、乱数を生成します。作成される乱数は 0 以上 1 未満の数値で、必要に応じて指定した範囲の乱数になるようにすることができます。ここでは Excel VBA における Rnd 関数の使い方について解説します。
(Last modified: )
Rnd関数の定義と使い方
Rnd
関数は 0 以上 1 未満の乱数を生成し返します。
Rnd 関数はシード値に基づいて乱数を生成します。同じシード値を使用して乱数を生成すると、同じ順番で乱数が生成されます。
Excel を起動すると自動的にシード値が設定されますが、このシード値は毎回同じ値が設定されます。そのため、乱数を生成しても明示的にシード値を変更しないと毎回同じ乱数の値が順番に生成されてしまいます。
次の例を見てください。
Option Explicit Sub Rnd関数() Debug.Print Rnd Debug.Print Rnd Debug.Print Rnd End Sub
Excel を起動して最初にこのプログラムを実行するとイミディエイトウィンドウには次のように表示されます。
では一度 Excel を終了し、あらためて Excel を起動してからもう一度同じプログラムを実行してみます。すると先ほどとまったく同じ乱数が生成されます。
Randomize文を使ってシード値を変更する
このように同じ乱数が生成されるのを防ぐには、乱数の生成に使用するシード値を変更する必要があります。手動で変更する方法はあとでご紹介しますが、自動的にシード値が変わるようにするには、乱数の生成を行う前に Randomize
文を実行します。
Randomize
先ほどのサンプルを次のように変更します。
Option Explicit Sub Rnd関数() Randomize Debug.Print Rnd Debug.Print Rnd Debug.Print Rnd End Sub
乱数の生成を行う前に Randomize
文を実行しています。これでシード値が変更されるため、プログラムを実行するたびに異なるシード値に基づいて乱数が生成されるようになります。
実際にExcel を起動して最初にこのプログラムを実行するとイミディエイトウィンドウには次のように表示されます。
先ほどとは異なる乱数が生成されました。ではもう一度 Excel を起動しなおして同じプログラムを実行してみます。
また先ほどとは異なる乱数が生成されました。このように乱数を生成するプログラムを記述する場合には、一度 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
プログラムを実行するとイミディエイトウィンドウには次のように表示されます。
まず最初にシード値として -3 を指定して乱数を生成します。次はシード値を指定していないので同じシード値の次の乱数を生成します。そのあと今度はシード値として -1 を指定して乱数を生成し、同じシード値でもう一度乱数を生成します。そして再度シード値として -3 を指定して乱数を生成すると、最初と同じ乱数が生成されているのが分かります。また次の乱数も同じです。
このようにシード値を手動で指定して乱数を生成することもできます。なお Rnd
関数の 1 番目の引数に正の値を指定した場合は引数を省略した場合と同じで、同じシード値の次の乱数を取得します。
一つ前に生成した乱数と同じ乱数を取得する
Rnd
関数の省略可能な 1 番目の引数に 0 を指定すると、一つ前に生成した乱数と同じ乱数を生成できます。
Rnd(0)
次の例を見てください。
Option Explicit Sub Rnd関数() Randomize Debug.Print Rnd Debug.Print Rnd(0) End Sub
プログラムを実行するとイミディエイトウィンドウには次のように表示されます。
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 から 6 までの範囲の乱数を取得することができました。
※ 今回のサンプルでは取得した乱数の整数部分を朱徳するために Int
関数を使用しています。 Int
関数の使い方については「Int関数:数値の整数部分を取得する」を参照されてください。
-- --
Excel VBA における Split 関数の使い方について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。